count()Gerçekten bir PHP dizisinin tüm öğelerini sayıyor mu , yoksa bu değer bir yerde önbelleğe alınıyor ve yeni mi alınıyor?
count()Gerçekten bir PHP dizisinin tüm öğelerini sayıyor mu , yoksa bu değer bir yerde önbelleğe alınıyor ve yeni mi alınıyor?
Yanıtlar:
Peki, kaynağa bakabiliriz:
/ext/standard/array.c
PHP_FUNCTION(count)php_count_recursive()sırayla zend_hash_num_elements()özyinelemeli olmayan diziyi çağıran çağrılar , bu şekilde uygulanır:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Böylece görebilirsiniz, bunun O(1)için $mode = COUNT_NORMAL.
IS_CONSISTENT(ht)?
PHP 5+ sürümünde uzunluk dizide saklanır, böylece sayım her seferinde yapılmaz.
DÜZENLEME: Bu analizi ilginç de bulabilirsiniz: PHP Sayım Performansı . Dizinin uzunluğu dizi tarafından korunsa da, count()birçok kez arayacaksanız, diziyi tutmak daha hızlı gibi görünüyor .
PHP bir dizinin boyutunu dahili olarak depolar, ancak yine de bir işlev çağrısı yapmadığınızdan daha yavaş olan bir işlev çağrısı yapıyorsunuz, bu nedenle, diziyi bir dizide kullanmak gibi bir şey yapıyorsanız sonucu bir değişkende saklamak isteyeceksiniz. döngü:
Örneğin,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Ek countolarak, bir dizide çağrıldığından her zaman emin olamazsınız . CountableÖrneğin uygulayan bir nesnede çağrılırsa, counto nesnenin yöntemi çağrılır.
the count method of that object will be called, lütfen bunu biraz açıklayabilir misin
Countablearabirimi uygularsa, çağrı çağırmakla count($object)aynı şeydir $object->count(). Örneğin 3v4l.org/oYSSC'ye bakın .
you're still making a function call when which is slower than not making oneBu ifade yanlış olabilir. Manüel geçiş yapıyorsanız, bu O(n)işlemdir. Ancak sadece önceden hesaplanmış bir değeri almak istiyorsanız, o zaman işlem olur O(1).