Pertama-tama, saya mengerti dalam 90% aplikasi perbedaan kinerja sama sekali tidak relevan, tetapi saya hanya perlu tahu mana yang lebih cepat membangun. Itu dan ...
Informasi yang tersedia saat ini di internet membingungkan. Banyak orang mengatakan foreach itu buruk, tetapi secara teknis seharusnya lebih cepat karena itu menyederhanakan menulis array array menggunakan iterators. Iterator, yang sekali lagi dianggap lebih cepat, tetapi dalam PHP juga tampaknya lambat lambat (atau ini bukan PHP?). Saya berbicara tentang fungsi-fungsi array: next () prev () reset () dll. Baik, jika mereka bahkan berfungsi dan bukan salah satu dari fitur bahasa PHP yang terlihat seperti fungsi.
Untuk mempersempit ini sedikit : Saya tidak menarik melintasi array dalam langkah-langkah lebih dari 1 (tidak ada langkah negatif juga, yaitu. Iterasi terbalik). Saya juga tidak tertarik pada traversal ke dan dari titik arbitrer, hanya 0 panjangnya. Saya juga tidak melihat memanipulasi array dengan lebih dari 1000 tombol yang terjadi secara teratur, tetapi saya memang melihat array yang dilalui beberapa kali dalam logika aplikasi! Juga untuk operasi, sebagian besar hanya manipulasi string dan echo'ing.
Berikut adalah beberapa situs referensi:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Apa yang saya dengar di mana-mana:
foreach
lambat, dan dengan demikianfor
/while
lebih cepat- PHP
foreach
menyalin array yang diulanginya ; untuk membuatnya lebih cepat, Anda perlu menggunakan referensi - kode seperti ini: lebih cepat dari a
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
Inilah masalah saya. Saya menulis skrip pengujian ini: http://pastebin.com/1ZgK07US dan tidak peduli berapa kali saya menjalankan skrip, saya mendapatkan sesuatu seperti ini:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
Pendeknya:
foreach
lebih cepat daripadaforeach
dengan referensiforeach
lebih cepat darifor
foreach
lebih cepat daripadafor
untuk tabel hash
Bisakah seseorang menjelaskan?
- Apakah saya melakukan sesuatu yang salah?
- Apakah referensi PHP foreach benar-benar membuat perbedaan? Maksud saya mengapa tidak menyalinnya jika Anda melewati referensi?
- Apa kode iterator yang setara untuk pernyataan foreach; Saya telah melihat beberapa di internet tetapi setiap kali saya mengujinya, waktunya tidak tepat; Saya juga telah menguji beberapa konstruksi iterator sederhana tetapi sepertinya tidak pernah mendapatkan hasil yang layak - apakah array iterators di PHP hanya buruk?
- Apakah ada cara / metode / konstruk yang lebih cepat untuk beralih melalui array selain FOR / FOREACH (dan WHILE)?
PHP Versi 5.3.0
Sunting: Jawab Dengan bantuan dari orang-orang di sini saya dapat mengumpulkan jawaban untuk semua pertanyaan. Saya akan meringkasnya di sini:
- "Apakah aku melakukan sesuatu yang salah?" Tampaknya konsensus: ya, saya tidak bisa menggunakan gema dalam tolok ukur. Secara pribadi, saya masih tidak melihat bagaimana gema adalah suatu fungsi dengan waktu eksekusi yang acak atau bagaimana fungsi lainnya entah bagaimana berbeda - itu dan kemampuan skrip itu untuk hanya menghasilkan hasil yang sama persis dari foreach lebih baik daripada semuanya sulit untuk menjelaskan meskipun hanya "Anda menggunakan gema" (baik apa yang seharusnya saya gunakan). Namun, saya mengakui tes harus dilakukan dengan sesuatu yang lebih baik; meskipun kompromi yang ideal tidak terlintas dalam pikiran.
- "Apakah referensi PHP foreach benar-benar membuat perbedaan? Maksudku mengapa itu tidak akan menyalinnya jika Anda melewati referensi?" ircmaxell menunjukkan bahwa ya, pengujian lebih lanjut tampaknya membuktikan dalam banyak kasus, referensi harus lebih cepat - meskipun dengan potongan kode saya di atas, yang paling pasti tidak berarti semua. Saya menerima masalah ini mungkin terlalu tidak intuitif untuk mengganggu pada tingkat seperti itu dan akan memerlukan sesuatu yang ekstrem seperti mendekompilasi untuk benar-benar menentukan mana yang lebih baik untuk setiap situasi.
- "Apa kode iterator yang setara untuk pernyataan foreach; Saya telah melihat beberapa di internet tetapi setiap kali saya menguji mereka waktunya tidak tepat; Saya juga telah menguji beberapa iterator yang sederhana tetapi sepertinya tidak pernah mendapatkan hasil yang layak. - Apakah array iterators di PHP hanya mengerikan? " ircmaxell memberikan jawaban di bawah ini; meskipun kode mungkin hanya valid untuk versi PHP> = 5
- "Apakah ada cara / metode / konstruksi yang lebih cepat untuk beralih melalui array selain FOR / FOREACH (dan WHILE)?" Terima kasih kepada Gordon untuk jawabannya. Menggunakan tipe data baru di PHP5 akan memberikan peningkatan kinerja atau peningkatan memori (salah satunya mungkin diinginkan tergantung pada situasi Anda). Meskipun kecepatan banyak jenis baru array tampaknya tidak lebih baik daripada array (), splpriorityqueue dan splobjectstorage tampaknya jauh lebih cepat. Tautan disediakan oleh Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Terima kasih semuanya yang mencoba membantu.
Saya kemungkinan akan berpegang teguh pada foreach (versi non-referensi) untuk setiap traversal sederhana.