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 count
olarak, bir dizide çağrıldığından her zaman emin olamazsınız . Countable
Örneğin uygulayan bir nesnede çağrılırsa, count
o nesnenin yöntemi çağrılır.
the count method of that object will be called
, lütfen bunu biraz açıklayabilir misin
Countable
arabirimi 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 one
Bu 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)
.