PHP foreach vs FOR Performans

0 Cevap php

Her şeyden önce, ben performans farkı tamamen alakasız olduğu uygulamalarda% 90 anlıyorum, ama sadece daha hızlı inşa olduğunu bilmek gerekir. Bu ve ...

Net onlara bilgiler mevcut kafa karıştırıcı. Birçok insan foreach kötü olduğunu söylüyorlar, ama yineleyicileri kullanarak bir dizi kastetmek yazma basitleştirmek için varsayalım beri teknik olarak daha hızlı olmalı. Tekrar hızlı olması için varsayalım, ama PHP edilir Yineleyicilerde, aynı zamanda yavaş görünüşte ölü (ya da bu değil, bir PHP şeydir?). Ben dizi işlevleri bahsediyorum: next () prev () sıfırlama (vb) de, onlar bile fonksiyonlar olup fonksiyonları gibi bak bu PHP dili özelliklerinden biri iseniz.

To narrow this down a little: Hiçbir şeyden fazla 1 adımlarla diziler geçme ilginç değilim (yani ya hiçbir olumsuz adım, yineleme ters.). Ben de, keyfi puan ve bir geçişi sadece 0 uzunluğuna ilgilenmiyorum. Ben de düzenli olarak oluyor 1000'den fazla tuşları ile diziler manipüle görmüyorum, ama ben bir dizi bir uygulama mantığı içinde birden çok kez geçilen ediliyor görüyorsunuz! Ayrıca operasyonlar için olduğu gibi, büyük ölçüde, yalnızca dize manipülasyon ve echo'ing.

Here are few reference sites:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php

Ben her yerde ne duymak:

  • foreach yavaş ve böylece for / while hızlıdır
  • PHPs foreach kopyalar üzerinde dolaşır dizi; yapmak için daha hızlı bir şekilde başvuruları kullanmak gerekir
  • Kod şöyle: $key = array_keys($aHash); $size = sizeOf($key);
    for ($i=0; $i < $size; $i++)
    bir foreach daha hızlıdır

İşte benim sorunum. http://pastebin.com/1ZgK07US olursa olsun ben komut dosyasını çalıştırın, kaç kez böyle bir şey olsun: Ben bu test senaryoyu yazdı:

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 atıfta bulunmak sureti ile daha hızlıdır
  • foreach for daha hızlıdır
  • foreach for daha hızlıdır for a hash table

Birisi açıklayabilir misiniz?

  1. Ben yanlış bir şey yapıyorum?
  2. PHP foreach referans şey gerçekten bir fark yapıyor? Ben size referans geçirirseniz neden onu kopyalamak olmaz demek?
  3. Foreach ifadesi için eşdeğer yineleyici kodu nedir; Ben net bir kaç gördüm ama ben onları test her zaman zamanlama kapalı yoludur; Ben de bir kaç basit yineleyici yapıları test edilmiş ancak daha iyi sonuçlar almak gibi hiç - PHP dizi Yineleyicilerde sadece korkunç?
  4. Daha hızlı yol / yöntem / yineleme var yapıları olsa İÇİN / foreach (ve SÜRE) dışında bir dizi?

PHP Version 5.3.0


Edit: Answer With help from people here I was able to piece together the answers to all question. I'll summarize them here:

  1. "Ben yanlış bir şey yapıyorum?" The consensus seems to be: yes, I can't use echo in benchmarks. Personally, I still don't see how echo is some function with random time of execution or how any other function is somehow any different -- that and the ability of that script to just generate the exact same results of foreach better than everything is hard to explain though just "you're using echo" (well what should I have been using). However, I concede the test should be done with something better; though a ideal compromise does not come to mind.
  2. "PHP foreach referans şey gerçekten bir fark yapıyor? Ben size referans geçirirseniz neden onu kopyalamak olmaz demek?" ircmaxell shows that yes it is, further testing seems to prove in most cases reference should be faster -- though given my above snippet of code, most definitely doesn't mean all. I accept the issue is probably too non-intuitive to bother with at such a level and would require something extreme such as decompiling to actually determine which is better for each situation.
  3. "Foreach ifadesi için eşdeğer yineleyici kodu nedir; Ben net bir kaç gördüm ama ben onları test her zaman zamanlama kapalı yoludur; Ben de bir kaç basit yineleyici yapıları test edilmiş ancak daha iyi sonuçlar almak gibi hiç - PHP dizi Yineleyicilerde sadece korkunç?" ircmaxell provided the answer bellow; though the code might only be valid for PHP version >= 5
  4. "Daha hızlı yol / yöntem / yineleme var yapıları olsa İÇİN / foreach (ve SÜRE) dışında bir dizi?" Thanks go to Gordon for the answer. Using new data types in PHP5 should give either a performance boost or memory boost (either of which might be desirable depending on your situation). While speed wise a lot of the new types of array don't seem to be better than array(), the splpriorityqueue and splobjectstorage do seem to be substantially faster. Link provided by Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/

Size yardım etmek için çalıştı herkese teşekkür ederiz.

Ben büyük olasılıkla herhangi bir basit geçişi için foreach (referans olmayan sürüm) için sopa olacak.

0 Cevap