PHP में === से ज्यादा तेज === क्यों है?


168

PHP की ===तुलना ==में तेज़ क्यों है ?


40
यह तेज है, लेकिन क्या यह काफी तेज है?
पिस्कोर ने बिल्डिंग

19
कृपया इस बारे में न पढ़ें कि php में क्या तेजी है। जॉयस को गाली दिए बिना एकल SQL क्वेरी में दिलचस्प डेटा प्राप्त करने के बारे में पढ़ें।
कामिल एसज़ोट

15
जिनके लिए यह एक ही विषय में रुचि हो सकती है === vs ==, लेकिन JAVASCRIPT में, यहाँ पढ़ सकते हैं: stackoverflow.com/questions/359494/…
Marco Demaio

5
@ मिसकॉल, यह सवाल नहीं है
पेसियर जूल

6
@ स्पेसर: फेयर पॉइंट - इसीलिए मैंने केवल इस पर टिप्पणी की है। यह प्रश्न का उत्तर नहीं देता है, लेकिन इस पर परिप्रेक्ष्य प्रदान करता है।
पिस्कोर ने

जवाबों:


200

क्योंकि समानता ऑपरेटर ==किसी अन्य ===ऑपरेटर के बराबर है या नहीं, यह देखने के लिए डेटा प्रकार अस्थायी रूप से कनवर्ट करता है, या कनवर्ट करता है, जबकि (पहचान ऑपरेटर) को किसी भी परिवर्तित करने की आवश्यकता नहीं है और इस तरह कम काम किया जाता है, जो इसे तेज़ बनाता है।


मुझे लगता है कि PHP मैनुअल जो कहता है, उससे आपकी राय विपरीत है। वे कहते हैं कि $ a == $ b TRUE है यदि $ a $ b के बराबर है, जहां $ a === $ b TRUE है यदि $ a $ b के बराबर है, और वे एक ही प्रकार के हैं।
बख्तियार

92
यह कैसे विपरीत है, फिर?
पदक विजेता

2
मेरा मानना ​​है कि यह वास्तव में है कि 2 ऑपरेंड्स जटिल प्रकारों के लिए स्मृति के एक ही क्षेत्र को इंगित करते हैं लेकिन पदक का उत्तर इसमें शामिल है
बेसिक

1
यह समझ में आता है (जैसा कि यह जेएस में है), लेकिन यह अच्छा होगा यदि कोई व्यक्ति कुछ वास्तविक सरल प्रदर्शन परीक्षणों का संदर्भ भी जोड़ता है।
मार्को डेमायो

4
"कंट्रोल स्ट्रक्चर्स" सेक्शन के तहत phpbench.com में == और === के बीच अंतर का प्रदर्शन है।
ekillaby

54

===टाइपकास्टिंग नहीं करता है, इसलिए 0 == '0'मूल्यांकन करता है true, लेकिन 0 === '0'- को false


25

पहले, === यह देखने के लिए जाँच करता है कि क्या दो तर्क एक ही प्रकार के हैं - इसलिए नंबर 1 और स्ट्रिंग '1' टाइप चेक पर विफल रहता है इससे पहले कि कोई तुलना की जाए। दूसरी ओर, == पहले प्रकार की जाँच नहीं करता है और आगे बढ़ता है और दोनों तर्कों को एक ही प्रकार में परिवर्तित करता है और फिर तुलना करता है।

इसलिए, === एक विफल स्थिति की जाँच करने में तेज है


8
मुझे लगता है कि ==किसी भी प्रकार के रूपांतरण की आवश्यकता है, यह देखने के लिए पहले प्रकार की जांच करता है। यह तथ्य कि ===निम्नलिखित चरण में कोई रूपांतरण नहीं होता है, जो इसे तेज बनाता है।
deceze

25

विचार करने के लिए दो चीजें हैं:

  1. यदि ऑपरेंड प्रकार अलग-अलग होते हैं ==और विभिन्न परिणाम=== उत्पन्न करते हैं । उस मामले में ऑपरेटरों की गति कोई फर्क नहीं पड़ता; क्या मायने रखता है जो एक वांछित परिणाम पैदा करता है।

  2. यदि ऑपरेंड प्रकार समान हैं तो आप ==या तो उपयोग कर सकते हैं या ===दोनों एक ही परिणाम का उत्पादन करेंगे । उस स्थिति में दोनों ऑपरेटरों की गति लगभग समान है। इसका कारण यह है कि ऑपरेटरों द्वारा किसी भी प्रकार का रूपांतरण नहीं किया जाता है।

मैंने इसकी गति की तुलना की:

  • $a == $b बनाम $a === $b
  • कहाँ $aऔर $bयादृच्छिक पूर्णांक थे [1, 100]
  • दो चर उत्पन्न हुए थे और उनकी तुलना दस लाख बार की गई थी
  • परीक्षण 10 बार चलाए गए

और यहाँ परिणाम हैं:

 $a == $b $a === $b
--------- ---------
 0.765770  0.762020
 0.753041  0.825965
 0.770631  0.783696
 0.787824  0.781129
 0.757506  0.796142
 0.773537  0.796734
 0.768171  0.767894
 0.747850  0.777244
 0.836462  0.826406
 0.759361  0.773971
--------- ---------
 0.772015  0.789120

आप देख सकते हैं कि गति लगभग समान है।


13
मुझे आश्चर्य है कि क्या होता है अगर आप एक मशीन पर कुछ अरब पुनरावृत्तियों करते हैं जो कुछ और नहीं कर रहा है और औसत उत्पादन करता है। ऐसा लगता है कि यहाँ बहुत शोर है। ;)
गोंग फू

4
मैं एक ही निष्कर्ष पर आया था: यदि ऑपरेंड को एक ही प्रकार से जाना जाता है तो कोई अंतर नहीं किया जा सकता है। अन्य परिदृश्यों को स्पष्ट नहीं करते हैं। लगभग सभी अन्य उत्तर गलत हैं।
पॉल स्पीगेल

1
मेरा मानना ​​है कि यह चयनित उत्तर होना चाहिए था। यह केवल मान्यताओं के साथ तर्कसंगत नहीं है, मान्यताओं को अधिक अयस्क कम अनुभवजन्य रूप से परीक्षण किया गया था।
पेड्रो अमरल कोट्टो

@PedroAmaralCouto मुझे ऐसा नहीं लगता, क्योंकि 10 एक अनुभवजन्य अध्ययन नहीं है। कोई अंतर नहीं होने का मुख्य कारण यह है कि PHP कंपाइलर शायद कोड का अनुकूलन करेगा। किसी को === का उपयोग करना चाहिए जब तक कि टाइप रूपांतरण की आवश्यकता न हो, यह शब्दार्थ त्रुटि को कम करने में मदद करेगा (भले ही यह आपके पूरे जीवन में एक बार हो)। यह अगले व्यक्ति को कोड पढ़ने में भी मदद करता है कि कौन से नियम लागू किए गए हैं। आप एक बार लिखते हैं, यह कुछ सौ बार पढ़ा जाता है, अगर यह एक व्यक्ति के संदेह को स्पष्ट करने में मदद कर सकता है, तो यह पहले से ही सफल है। इसके अलावा क्लोन के बाद से कोई भी मेमोरी टेस्ट अगर इम्पिरिकल है। केवल समय से अधिक संसाधन हैं।
मार्को

@ मार्को, जब मैं कहता हूं कि "अनुभवजन्य अध्ययन", मेरा मतलब है कि यह अनुभव पर आधारित है, उदाहरण के लिए: केवल तर्क (या आपके मन में क्या है) का उपयोग करने के बजाय, इसे चलाने के लिए एक प्रयोग किए बिना। सलमान ए मूल्यों का सुझाव देते हैं === समान रूप से कभी-कभी थोड़ा तेज होता है और कभी-कभी थोड़ा धीमा होता है। इसका मतलब "PHP में == से अधिक तेज === तेज क्यों है?" प्रश्न पूछती है: "आप कैसे जानते हैं === == से तेज है"? कंपाइलर ऑप्टिमाइज़ेशन एक स्पष्टीकरण है, न कि जो तेज या धीमा है और मैंने यह नहीं कहा कि क्या उपयोग किया जाना चाहिए।
पेड्रो अमरल कोट्टो

7

मुझे वास्तव में पता नहीं है कि क्या यह काफी तेज है, लेकिन ज्यादातर भाषाओं में === एक प्रत्यक्ष प्रकार की तुलना है, जबकि == अगर मैच हासिल करने के लिए आवश्यक / संभव हो तो टाइप जबरदस्ती करने की कोशिश करेंगे।


9
जावास्क्रिप्ट का === ऑपरेटर है।
फ्रैंक शीयर

मुझे यकीन है कि आप सामान्य लिस्प और योजना में === कर सकते हैं।
पुतीनो

जावास्क्रिप्ट - मेरे द्वारा जांची गई 3 लैंग्वेज परिभाषाओं में नहीं;) और लिस्प और स्कीम कई चीजें हैं, लेकिन शायद ही आम हैं;)
टॉमटॉम

1
माणिक = = है। मेरे लिए यह याद रखना बहुत लंबा हो गया है कि क्या यह वही काम करता है।
KitsuneYMG

1
इसके अलावा, liveocs.adobe.com/flash/9.0/ActionScriptLangRefV3/… एक्शनस्क्रिप्ट के लिए। मूल रूप से, Google "सख्त समानता"।
क्रिस

4

तुलना के पहले == प्रकार रूपांतरण का एक बड़ा ओवरहेड होता है। === पहले प्रकार की जाँच करता है, फिर किसी प्रकार का रूपांतरण किए बिना आगे बढ़ता है।


4

क्योंकि उनकी तुलना करने से पहले === ऑपरेटर्स को एक ही प्रकार का होने के लिए मजबूर करने की आवश्यकता नहीं है।

मुझे संदेह है कि गति में अंतर बहुत अधिक है। सामान्य परिस्थितियों में आपको जो भी ऑपरेटर का उपयोग करना चाहिए वह अधिक समझ में आता है।


3

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


0

तेज़ को केवल प्रत्यक्ष निष्पादन समय में नहीं मापा जाना चाहिए (प्रत्यक्ष प्रदर्शन परीक्षण इस मामले में लगभग नगण्य हैं)। उस ने कहा, मुझे पुनरावृत्ति या पुनरावृत्ति से जुड़े एक परीक्षण को देखने की आवश्यकता है, वास्तव में यह देखने के लिए कि क्या एक महत्वपूर्ण, संचयी अंतर है (जब एक यथार्थवादी संदर्भ में उपयोग किया जाता है)। किनारे के मामलों से निपटने के दौरान आप जो परीक्षण और डिबगिंग का समय बचाएंगे, वह आपके लिए भी सार्थक होना चाहिए


0

Php (c कोड) मान में एक "वर्ग" है जैसे:

class value
{
    $int_;
    $float_;
    $string_;
    $array_;
    $object_;
}

जब आपके तुलना कर रहे हैं $a == $bऔर $aहै intप्रकार, वहाँ की तरह कुछ हो जाएगा:

if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)

लेकिन string '1'ascii कोड में नहीं डाला 49जाएगा, यह होगा 1

जब आप तुलना कर रहे हैं $a === $bऔर $aहै intप्रकार, वहाँ तरह someting हो जाएगा:

if ($a->int_ == $b->int_)

-4

यदि परीक्षण के परिणाम सही हैं, तो यह एक संकलक मुद्दा होना चाहिए,

प्रोसेसर एक घड़ी चक्र पर जो कुछ भी करने के लिए कहा गया है वह करेगा

अगर यह करना कम है तो यह करना जल्दी होगा

इसके अलावा:

वास्तव में अच्छी तरह से अगर संकलक को संसाधित करने के लिए पहले से ही मशीन कोड का भार पैदा हो गया है, तो अगर यह पहले से ही सामग्री के किस प्रकार के साथ तुलना करने के लिए सामानों के युग्मों को जोड़ दिया है, तो एक "मामूली" को हटाने से गति में बदलाव नहीं होगा बिल्कुल भी।

अगर कोई अभी भी इसे पढ़ता है तो मैं अधिक चर्चा में दिलचस्प हूं।

फिल


क्या आपके पास अपने कोड बेस में केवल "एक" IF स्टेटमेंट है? यह अजीब है क्योंकि मेरे द्वारा काम किए गए प्रत्येक कोड आधार में, हमारे पास हजारों IF या तुलनात्मक कथन हैं जो हर जगह कहे जाते हैं।
लेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.