PHP dizisi: saymak veya sizeof?


216

Daha $arrayhızlı / daha iyi / daha güçlü olan bir PHP öğelerin sayısını bulmak için ?

count($array)veya sizeof($array)?

Düzenle

Andy Lester sayesinde, sorumu çok dilli bir bakış açısıyla ifade ettim. Manuel yorumcular diyor ki

"[sizeof], C'ye dayalı diğer birçok dilde aynı anlama gelmez"

Bu doğru mu?


72
Daft Punk referansı ... :)
Ben

2
Çok güzel bir soru. Ama işte sizeof'in sadece 21µs daha hızlı olduğunu söyleyen iyi bir karşılaştırma sitesi
sinaneker

Yanıtlar:


191

count()Deneyimlerime göre daha yaygın olduğu için aynı oldukları takdirde kullanacağım ve bu nedenle kodunuzu okuyan daha az geliştiricinin " sizeof()bu nedir?" ve belgelere başvurmak zorunda.

Bence sizeof()C (bir veri tipinin boyutunu hesaplamak) yaptığı gibi çalışmıyor anlamına gelir . Muhtemelen PHP yazılmıştır C açıkça çünkü bu söz yapılmış ve C fonksiyonları (için aynı adlı sarmalayıcılarının bir sürü sağlar strlen(), printf()vs.)


92

Phpbench'e göre :

Döngünün uzunluğunu önceden hesaplama çabalarına değer mi?

//pre-calculate the size of array
$size = count($x); //or $size = sizeOf($x);

for ($i=0; $i<$size; $i++) {
    //...
}

//don't pre-calculate
for ($i=0; $i<count($x); $i++) { //or $i<sizeOf($x);
    //...
}

1 byte değerine sahip 1000 anahtarlı bir döngü verilir.

                  +---------+----------+
                  | count() | sizeof() |
+-----------------+---------+----------+
| With precalc    |     152 |      212 |
| Without precalc |   70401 |    50644 |
+-----------------+---------+----------+  (time in µs)

Ben şahsen ön calc ile sizeof () yerine count () kullanmayı tercih ediyorum .


3
Lütfen hangisinin daha az zaman aldığını söyleyin. Yoksa cevap da oldukça karmaşık ve kafa karıştırıcı! Teşekkürler
Pratik

6
hangi php sürümü ile test yapıyordunuz? Daha yeni sürümlerde, bu sonuçları oldukça farklı hale getirebilecek birçok optimizasyon var
John Hunt

4
neden değişkenin sonucunu bir değişkene kaydetmeden daha hızlıdır, aksi halde tam tersi olur? Bu php yorumlayıcı bir tür seçici ek yükü neden bazı kötü tasarım seçim mi? Bunu nasıl karşılaştırdığınızı bilmek istiyorum, mikrosaniye ölçümü beni endişelendiriyor. belki bu döngü için bir dış büyük miktarda çalıştırmayı deneyin?
FluorescentGreen5

1
"pre calc" ile ne demek istiyorsun?
rubo77

1
@ rubo77 Yukarıdaki koda bakınız; "pre-calc", for döngüsünden önce dizinin boyutunu bir kez belirler. "Ön kireç" olmadan for-loop içinde dizi boyutunu belirler
RobIII

38

Göre aynı sizeof()

"Daha hızlı" hakkında endişelenmek için herhangi bir neden olmadığında, her zaman insan için optimize edin. Hangi insan okuyucu için daha mantıklı?


19

Web sitesine göre sizeof(), bir takma addır count(), bu yüzden aynı kodu çalıştırıyor olmalıdırlar. Belki sizeof()çözmesi gereken bir miktar yükü var count()? Yine de çok az olmalıdır.


53
Tahmin ettiğin için üzgünüm? Sadece aynı şey olduklarını söylüyordum. Daha sonra, gerçek işlev yerine bir işlev için bir diğer ad kullanmanın çok az daha yavaş olabileceği mantıklı bir çıkarımda bulundum, ancak "belki" kelimesiyle ön plana çıkararak hiçbir fikrim olmadığını itiraf ettim. Bu seni rahatsız ederse özür dilerim. Belki bir dahaki sefere "sonsuz" kelimesini kullanacağım.
Andy Groff

8

Bu eski olduğunu biliyorum ama sadece PHP 7.2 ile denedim bahsetmek istedim :

<?php
//Creating array with 1 000 000 elements
$a = array();
for ($i = 0; $i < 1000000; ++$i)
{
    $a[] = 100;
}

//Measure
$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = count($a);
}
print("1 000 000 000 iteration of count() took ".(time()-$time)." sec\n");

$time = time();
for ($i = 0; $i < 1000000000; ++$i)
{
    $b = sizeof($a);
}
print("1 000 000 000 iteration of sizeof() took ".(time()-$time)." sec\n");
?>

ve sonuç şuydu:

1 000 000 000 iteration of count() took 414 sec
1 000 000 000 iteration of sizeof() took 1369 sec

Sadece kullanın count().


Bu ilginç. Hangi PHP sürümünü kullanıyorsunuz?
waza

@waza PHP 7.2 kullanıyorum
Mehdi Bounya

1
PHP 7.3.3 ile: 1 000 000 000 iteration of count() took 525 sec 1 000 000 000 iteration of sizeof() took 1361 sec
AnthonyB


-2

Lütfen count işlevini kullanın, İşte bir öğedeki dizinin nasıl sayılacağına dair bir örnek

$cars = array("Volvo","BMW","Toyota");
echo count($cars);

count()İşlev, bir dizideki elementlerin sayısını verir.

sizeof()İşlev, bir dizideki elementlerin sayısını verir.

sizeof()Fonksiyon bir takma count()işlevi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.