Array PHP: jumlah atau ukuran?

216

Untuk menemukan jumlah elemen dalam PHP $array, mana yang lebih cepat / lebih baik / lebih kuat?

count($array)atau sizeof($array)?

Edit

Terima kasih kepada Andy Lester, saya telah mempersempit pertanyaan saya dari sudut pandang multibahasa. Komentator manual mengatakan

"[sizeof] tidak berarti sama dalam banyak bahasa lain berdasarkan pada C"

Apakah ini benar?

Ben
sumber
72
Referensi Daft Punk ... :)
Ben
2
Pertanyaan yang sangat bagus Tapi di sini ada situs benchmark yang bagus, yang mengatakan sizeof hanya 21 μs lebih cepat
sinaneker

Jawaban:

191

Saya akan menggunakan count()jika mereka sama, seperti dalam pengalaman saya itu lebih umum, dan karena itu akan menyebabkan lebih sedikit pengembang membaca kode Anda untuk mengatakan " sizeof(), apa itu?" dan harus berkonsultasi dengan dokumentasi.

Saya pikir itu berarti sizeof()tidak berfungsi seperti halnya di C (menghitung ukuran datatype). Ini mungkin membuat menyebutkan ini secara eksplisit karena PHP ditulis dalam C, dan menyediakan banyak identik bernama pembungkus untuk fungsi C ( strlen(), printf(), dll)

alex
sumber
92

Menurut phpbench :

Apakah sepadan dengan upaya untuk menghitung panjang loop di muka?

//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);
    //...
}

Sebuah loop dengan 1000 kunci dengan nilai 1 byte diberikan.

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

Jadi saya pribadi lebih suka menggunakan count () daripada sizeof () dengan pra kalk .

Reza Baradaran Gazorisangi
sumber
3
Tolong beritahu hanya yang membutuhkan waktu lebih sedikit. Kalau tidak, jawabannya cukup rumit dan membingungkan! Terima kasih
Pratik
6
versi php apa yang Anda uji? Versi yang lebih baru memiliki banyak optimisasi yang dapat membuat hasil ini sangat berbeda
John Hunt
4
mengapa sizeof lebih cepat tanpa menyimpan hasil itu menjadi variabel tetapi sebaliknya itu sebaliknya? Apakah ini beberapa pilihan desain yang buruk di interpreter php yang menyebabkan semacam overhead selektif? Saya ingin tahu bagaimana Anda melakukan benchmark ini, pengukuran microsecond membuat saya khawatir. mungkin mencoba menjalankan ini sejumlah besar kali di luar untuk loop?
FluorescentGreen5
1
apa maksudmu dengan "pre calc"?
rubo77
1
@ rubo77 Lihat kode di atas; "pre-calc" menentukan ukuran array sekali, sebelum for-loop. Tanpa "pre-calc" menentukan ukuran array di dalam for-loop
RobIII
38

Mereka identik menurut sizeof()

Dengan tidak adanya alasan untuk khawatir tentang "lebih cepat", selalu optimalkan untuk manusia. Mana yang lebih masuk akal bagi pembaca manusia?

Andy Lester
sumber
19

Menurut situs web, sizeof()adalah alias count(), jadi mereka harus menjalankan kode yang sama. Mungkin sizeof()ada sedikit overhead karena perlu menyelesaikannya count()? Itu harus sangat minim.

Andy Groff
sumber
53
Yah, maaf sudah menebak? Saya hanya menyatakan bahwa mereka sebenarnya hal yang sama. Kemudian, saya membuat kesimpulan logis bahwa menggunakan alias untuk suatu fungsi alih-alih fungsi yang sebenarnya mungkin sangat lambat, tetapi saya akui bahwa saya benar-benar tidak tahu dengan membukanya dengan kata "mungkin." Maaf jika itu menyinggung Anda. Mungkin lain kali saya akan menggunakan kata "sangat kecil."
Andy Groff
8

Saya tahu ini sudah lama tetapi hanya ingin menyebutkan bahwa saya mencoba ini dengan PHP 7.2:

<?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");
?>

dan hasilnya adalah:

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

Jadi gunakan saja count().

Mehdi Bounya
sumber
Ini menarik. Versi PHP apa yang Anda gunakan?
waza
@waza Saya menggunakan PHP 7.2
Mehdi Bounya
1
Dengan PHP 7.3.3: 1 000 000 000 iteration of count() took 525 sec 1 000 000 000 iteration of sizeof() took 1361 sec
AnthonyB
6

sizeof()hanyalah alias count() seperti yang disebutkan di sini

http://php.net/manual/en/function.sizeof.php

Mina Ragaie
sumber
4
+ alex ya. Saya melihat dua tautan. Apakah Anda berharap dia menulis ulang sizeof? LOL: p
Gogol
-2

Silakan gunakan fungsi hitung, Ini adalah contoh cara menghitung array dalam suatu elemen

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

The count()fungsi mengembalikan jumlah elemen dalam array.

The sizeof()fungsi mengembalikan jumlah elemen dalam array.

The sizeof()fungsi alias dari count()fungsi.

Harish rana
sumber