क्या count()वास्तव में एक PHP सरणी के सभी तत्वों को गिना जाता है, या क्या यह मूल्य कहीं कैश किया गया है और बस पुनर्प्राप्त हो जाता है?
क्या count()वास्तव में एक PHP सरणी के सभी तत्वों को गिना जाता है, या क्या यह मूल्य कहीं कैश किया गया है और बस पुनर्प्राप्त हो जाता है?
जवाबों:
खैर, हम स्रोत को देख सकते हैं:
/ext/standard/array.c
PHP_FUNCTION(count)कॉल php_count_recursive(), जो बदले में zend_hash_num_elements()गैर-पुनरावर्ती सरणी के लिए कॉल करता है, जिसे इस तरह से लागू किया जाता है:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
तो आप देख सकते हैं, यह O(1)है $mode = COUNT_NORMAL।
IS_CONSISTENT(ht)हालांकि क्या करता है?
PHP में 5+ लंबाई सरणी में संग्रहीत की जाती है, इसलिए प्रत्येक बार गिनती नहीं की जाती है।
संपादित करें: आप भी इस विश्लेषण को दिलचस्प पा सकते हैं: PHP गणना प्रदर्शन । हालाँकि, सरणी की लंबाई सरणी द्वारा बनाए रखी जाती है, फिर भी ऐसा लगता है जैसे कि अगर आप count()कई बार कॉल करने जा रहे हैं तो इसे पकड़ना तेज़ है ।
PHP एक सरणी के आकार को आंतरिक रूप से संग्रहीत करता है, लेकिन आप अभी भी एक फ़ंक्शन कॉल कर रहे हैं, जो कि एक न बनाने की तुलना में धीमा है, इसलिए आप परिणाम को एक चर में संग्रहीत करना चाहते हैं यदि आप कुछ का उपयोग कर रहे हैं जैसे पाश:
उदाहरण के लिए,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
इसके अतिरिक्त, आप हमेशा यह सुनिश्चित नहीं कर सकते कि countकिसी सरणी पर कॉल किया जा रहा है। यदि इसे किसी ऐसी वस्तु पर बुलाया जाता है जो Countableउदाहरण के लिए लागू होती है, तो countउस वस्तु की विधि कहलाएगी।
the count method of that object will be called, क्या आप इसे थोड़ा समझा सकते हैं
Countableइंटरफ़ेस को लागू करता है, तो कॉलिंग कॉलिंग count($object)के समान है $object->count()। उदाहरण के लिए 3v4l.org/oYSSC देखें ।
you're still making a function call when which is slower than not making oneयह कथन गलत हो सकता है। यदि आप मैनुअल ट्रैवर्सल कर रहे हैं, तो वह O(n)ऑपरेशन है। लेकिन अगर आप सिर्फ एक पूर्व गणना मूल्य प्राप्त करना चाहते हैं, तो ऑपरेशन है O(1)।