2016-07-11 2 views
9

पीएचपी 7 धीरे unrolling जाता है और लोगों को यह काम करने के साथ शुरू करते हैं, और इसलिए कर रहा हूँ मैंफ़ंक्शन में घोषणा टाइप करने से मेरा कोड बेहतर प्रदर्शन करेगा?

PHP7 में नई सुविधाओं में से एक यह है कि आप आदानों के लिए give functions a type declaration कर सकते हैं, और परिणाम के लिए एक प्रकार घोषणा।

उदाहरण के लिए, एक इनपुट एक स्ट्रिंग, एक एक पूर्णांक होना चाहिए और परिणाम बूलियन हो जाएगा:

// PHP <7 
function foo($example, $someNumber) {} 
// PHP 7 
function foo(string $example, int $someNumber): bool{} 

declare(strict_types=1) बिना मुझे पता है कि जब आप गलत प्रकार डालें, यह परिवर्तित हो जाता है। यदि आप $example के लिए कोई संख्या दर्ज करेंगे, तो इसे स्ट्रिंग में परिवर्तित कर दिया जाएगा। यदि आप फ्लोट नंबर $someNumber के रूप में जोड़ते हैं, तो इसे एक गोल संख्या में परिवर्तित कर दिया जाएगा। गिरावट के साथ, आपको एक प्रकार की त्रुटि मिलती है।

संभव "सर्वोत्तम प्रथाओं" के अलावा, मेरे कोड को प्रकार के घोषणाओं के साथ अद्यतन करने से कोड के प्रदर्शन में सुधार होगा? मुझे लगता है कि ऐसा इसलिए हो सकता है क्योंकि अब मैं दुभाषिया को बता रहा हूं कि क्या उम्मीद करनी है, लेकिन यह अतिरिक्त प्रकार की जांच भी जोड़ सकता है।
क्या इन कार्यों को अद्यतन करने के लिए प्रयास और समय लायक होगा?

+5

प्रकार संकेतों का एक बड़ा हिस्सा यह है कि वे प्रोग्रामर * के लिए एक सहायता * हैं। सही उपकरण (बुद्धिमान आईडीई, स्थिर प्रकार चेकर्स) के साथ, आप अपने कोड को चलाने से पहले त्रुटियों की पूरी कक्षाओं से बच सकते हैं। चूंकि PHP आमतौर पर समय से पहले संकलित नहीं होता है, इसलिए संभवतया एक स्थिर संकलक के रूप में कई प्रदर्शन सुधार नहीं होंगे। – deceze

उत्तर

17

आखिरकार, प्रकार की घोषणाओं को जोड़ने पर प्रदर्शन आपकी चिंता नहीं होनी चाहिए। वे प्रोग्रामर के जीवन को आसान बनाने के लिए मौजूद हैं, न कि दुभाषिया के। अगर आपको लगता है कि वे आपके लिए सहायक होंगे तो उनका प्रयोग करें। चाहे आप प्रकार की घोषणाओं का उपयोग करें या नहीं, आपके कोड के प्रदर्शन का मुख्य निर्धारक होने की संभावना नहीं है।

इसके साथ ही कहा जा रहा है, वर्तमान में (PHP 7.0) वहाँ वास्तव में एक छोटा सा प्रदर्शन दंड जब प्रकार घोषणाओं उपयोग किया जाता है, पीएचपी अब मान आप में और कार्यों से बाहर पारित के प्रकार की जाँच करने के लिए किया है। यह तेजी से होता है सब पर जांच नहीं करने के लिए है, जो है क्या होता है जब आप एक प्रकार घोषणा की जरूरत नहीं है जब।

हालांकि, यह थोड़ा अधिक है कि तुलना में सूक्ष्म है, और स्थिति बदल रही है।

सख्त टाइपिंग बलों क्या आप सख्त टाइपिंग उपयोग कर रहे हैं सही प्रकार

पारित करने के लिए, आप आदर्श प्रकार (जैसे पूर्णांक) के मान पारित करने के लिए है, बल्कि कुछ अन्य प्रकार के पारित करने के लिए सक्षम किया जा रहा (से उदाहरण के लिए स्ट्रिंग) और PHP आपके लिए इसे परिवर्तित कर देता है। प्रकार रूपांतरण समय लगेगा: सही प्रकार पासिंग पीएचपी कुछ अन्य प्रकार से परिवर्तित आप के लिए होने से तेज है।

प्रकार घोषणाओं दोहराया जा सकता से बचने प्रकार रूपांतरण

आप प्रकार घोषणाओं का उपयोग करते हैं, सख्त टाइपिंग के साथ है या नहीं, आप आमतौर पर एक ही मूल्य के लिए दोहराया प्रकार रूपांतरण से बचें।

आम तौर पर, यदि आपके पास ऐसा कोई फ़ंक्शन है जो कई संख्या संचालन करता है, और आप एक स्ट्रिंग तर्क में गुजरते हैं, तो PHP को इसे प्रत्येक बार ऑपरेशन करने के लिए उचित संख्या प्रकार (int या float) में परिवर्तित करना होगा।

लेकिन अगर आप उस कथन पर एक प्रकार घोषणा की है, यह केवल एक बार परिवर्तित हो जाता है, या तो स्वत: (कमजोर टाइपिंग मोड) या यह है क्योंकि आप स्पष्ट रूप से परिवर्तित अपने आप को।

प्रकार घोषणाओं प्रकार-जांच

प्रकार घोषणाओं अपने PHP क्रम गारंटी देता है कि यह कभी कभी प्रकार चेकों यह अन्यथा करना है से बचने के लिए उपयोग कर सकते हैं दे छिपाना को पीएचपी सक्षम करें। ,

$a = $b * $c; 
प्रकार घोषणाओं के बिना

पीएचपी पहले $b और $c इससे पहले कि यह वास्तव में उन्हें गुणा कर सकते हैं पर एक आंतरिक प्रकार की जांच करने के लिए किया है, उदाहरण के लिए, निम्न कोड पंक्ति ले PHP को यह सुनिश्चित करने की ज़रूरत है कि वे दोनों प्रकार के हैं, यदि वे नहीं हैं, तो उन्हें परिवर्तित करें, और उसके बाद उचित प्रकार के गुणा (int × int, float × int इत्यादि) को निष्पादित करें।

लेकिन अगर आपने पहले से $b और $c के प्रकार घोषित किए हैं, तो PHP को उन्हें यहां जांचने की आवश्यकता नहीं है, और तुरंत वास्तविक गुणा कर सकते हैं। यह तेज़ है। यह विशेष रूप से सच है यदि आप फ़ंक्शन के अंदर इन चर के साथ कई संचालन करते हैं।

ओपेकैच का उपयोग करते समय यह अनुकूलन PHP 7.1 में लागू किया गया है।

तर्क और छुटकारा मूल्य प्रकार चेक से छुटकारा पाने के लिए भी इसी तरह के अनुकूलन लागू किए जा सकते हैं। उदाहरण के लिए, यदि एक फ़ंक्शन पैरामीटर घोषित करता है तो एक int है, फिर उसके प्रकार को फिर से जांचने की आवश्यकता नहीं है, यदि वह उस तर्क को किसी अन्य फ़ंक्शन पर पास करता है जो एक int की अपेक्षा करता है। PHP 7.1 वर्तमान में कुछ अनावश्यक रिटर्न प्रकार चेक (और ओपेकैच का उपयोग करते समय अधिक) को छोड़ सकता है, लेकिन तर्क प्रकार चेक नहीं।

इन प्रकार के अनुकूलन के कारण, प्रकार की घोषणाओं के साथ कोड के लिए प्रदर्शन जुर्माना छोटा हो रहा है, और भविष्य में कोड के बिना कोड की घोषणा के साथ कोड के लिए काफी संभावना है।

+2

PHP 7.1 कुछ रिटर्न प्रकार चेक हटा सकता है, लेकिन तर्क जांच वर्तमान में elided नहीं हैं। – NikiC

+0

"यह अनुकूलन OPCache का उपयोग करते समय PHP 7.1 में लागू किया गया है", क्या आपके पास इसके लिए कोई स्रोत है या आप इसे खोजने के लिए सी कोड से गुजर चुके हैं? और यदि मैं आपके उत्तर को सही ढंग से समझता हूं, तो PHP 7.1 में प्रदर्शन * जुर्माना * ओपीसीएच के साथ कम हो जाता है लेकिन यह अभी भी बिना किसी प्रकार की घोषणा के कोड के मुकाबले जुर्माना है। क्या आप जानते हैं कि PHP 7.2 के लिए स्थिति समान है या नहीं? –

+0

@ rink.attendant.6 PHP इंटर्नल मेलिंग सूची आईआईआरसी पर दिमित्री स्टोगोव द्वारा इसके बारे में कुछ लिखा गया है, लेकिन मुझे यकीन नहीं है कि इसे कैसे ढूंढें। – Andrea

संबंधित मुद्दे