Her şeyden önce, uygulamaların% 90'ında performans farkının tamamen alakasız olduğunu anlıyorum, ancak sadece hangisinin daha hızlı olduğunu bilmem gerekiyor. Bu ve ...
İnternette şu anda mevcut olan bilgiler kafa karıştırıcı. Pek çok insan foreach'in kötü olduğunu söylüyor, ancak teknik olarak daha hızlı olması gerekiyor çünkü yineleyiciler kullanarak bir dizi geçişi yazmayı basitleştirmesi gerekiyor. Yine daha hızlı olduğu varsayılan yineleyiciler, ancak PHP'de de görünüşe göre çok yavaşlar (veya bu bir PHP olayı değil mi?). Dizi işlevlerinden bahsediyorum: next () prev () reset () vb. İyi, eğer onlar işlevlerse ve işlevlere benzeyen PHP dili özelliklerinden biri değilse.
Bunu biraz daraltmak için : Dizileri 1'den fazla adımlarla dolaşmakla ilgilenmiyorum (negatif adımlar da yok, yani ters iterasyon). Ayrıca keyfi noktalardan ve noktalara geçişle de ilgilenmiyorum, sadece 0'dan uzunluğa. Düzenli olarak 1000'den fazla anahtar içeren dizilerin işlendiğini de görmüyorum, ancak bir dizinin bir uygulamanın mantığında birden çok kez geçtiğini görüyorum! Ayrıca işlemlere gelince, büyük ölçüde yalnızca dizge işleme ve yankılama.
İşte birkaç referans site:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
Her yerde duyduğum şey:
foreach
yavaştır ve dolayısıylafor
/while
daha hızlıdır- PHP
foreach
, üzerinde yinelediği diziyi kopyalar; daha hızlı hale getirmek için referanslar kullanmanız gerekir - bunun gibi kod: a'dan daha hızlı
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
İşte benim sorunum. Bu test komut dosyasını yazdım: http://pastebin.com/1ZgK07US ve komut dosyasını kaç kez çalıştırsam da şuna benzer bir şey elde ediyorum:
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
Kısacası:
foreach
foreach
referansla olduğundan daha hızlıforeach
daha hızlıfor
foreach
for
karma tablodan daha hızlıdır
Birisi açıklayabilir mi?
- Yanlış bir şey mi yapıyorum?
- PHP foreach referansı gerçekten bir fark yaratıyor mu? Demek istediğim, referansla geçerseniz neden kopyalamasın?
- Foreach ifadesi için eşdeğer yineleyici kodu nedir; İnternette birkaç tane gördüm ama onları her test ettiğimde zamanlama yanlış; Ayrıca birkaç basit yineleyici yapısını da test ettim, ancak hiçbir zaman düzgün sonuçlar bile almıyor - PHP'deki dizi yineleyiciler korkunç mu?
- FOR / FOREACH (ve WHILE) dışında bir dizide yinelemenin daha hızlı yolları / yöntemleri / yapıları var mı?
PHP Sürüm 5.3.0
Düzenleme: Cevap Buradaki insanların yardımıyla tüm soruların cevaplarını bir araya getirebildim. Onları burada özetleyeceğim:
- "Yanlış bir şey mi yapıyorum?" Fikir birliği şöyle görünüyor: evet, yankıyı kıyaslamalarda kullanamıyorum. Şahsen, yankının rastgele çalıştırma zamanına sahip bir işlev olduğunu ya da başka herhangi bir işlevin nasıl farklı olduğunu hala anlamıyorum - bu ve bu komut dosyasının her şeyden daha iyi foreach için aynı sonuçları üretme yeteneği zordur. "yankı kullanıyorsunuz" olsa da açıklamak için (ne kullanmalıydım). Ancak, testin daha iyi bir şeyle yapılması gerektiğini kabul ediyorum; akla ideal bir uzlaşma gelmiyor.
- "PHP foreach referansı gerçekten bir fark yaratıyor mu? Yani, referansla geçerseniz neden kopyalamasın?" ircmaxell gösteriyor ki evet öyle, ileri testler çoğu durumda referansın daha hızlı olması gerektiğini kanıtlıyor gibi görünüyor - yukarıdaki kod parçacığıma bakıldığında, kesinlikle hepsi anlamına gelmiyor. Sorunun muhtemelen böyle bir düzeyde uğraşmak için fazla sezgisel olmadığını ve her durum için hangisinin daha iyi olduğunu gerçekten belirlemek için derlemeyi çözme gibi aşırı bir şey gerektireceğini kabul ediyorum.
- "Foreach ifadesi için eşdeğer yineleyici kodu nedir; İnternette birkaç tane gördüm, ancak onları her test ettiğimde zamanlama çok yanlış; ayrıca birkaç basit yineleyici yapısını da test ettim ama hiçbir zaman düzgün sonuçlar bile alamadı - PHP'deki dizi yineleyiciler korkunç mu? " ircmaxell aşağıdaki cevabı verdi; ancak kod yalnızca PHP sürümü> = 5 için geçerli olabilir
- "FOR / FOREACH (ve WHILE) dışında bir dizide yinelemenin daha hızlı yolları / yöntemleri / yapıları var mı?" Cevap için Gordon'a teşekkürler. PHP5'te yeni veri türlerinin kullanılması, ya performans artışı ya da bellek artışı sağlamalıdır (durumunuza bağlı olarak bunlardan biri istenebilir). Hız açısından pek çok yeni dizi türü array () 'den daha iyi görünmese de splpriorityqueue ve splobjectstorage önemli ölçüde daha hızlı görünmektedir. Gordon tarafından sağlanan bağlantı: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
Yardım etmeye çalışan herkese teşekkür ederim.
Herhangi bir basit geçiş için foreach'e (referans olmayan versiyon) bağlı kalacağım.