SORU
7 AĞUSTOS 2010, CUMARTESİ


PHP İÇİN vs dosyalarda grup performans

Öncelikle, tamamen alakasız uygulamaların anlıyorum, ama ben sadece daha hızlı inşa olduğunu bilmek gerek. Ve...

Bu bilgi şu anda mevcut net onlara kafa karıştırıcı. Bir sürü insan dosyalarda grup için kötü, ama sanırım dizi bir geçiş kullanımına kullanarak yazma basitleştirmek için olduğundan daha hızlı olabilirdi teknik olarak söylüyorlar. Daha hızlı olması için varsayalım, ama PHP olan kullanımına, görünüşe göre de çok yavaş (ya da bu PHP bir şey değil mi?). Dizi fonksiyonları bahsediyorum: () sonraki önceki() reset() vb. eğer bile işlevleri ve fonksiyonları gibi olanlardan PHP dilinin özelliklerinden biri değildir?

Bu biraz daraltmak içinBir şey daha 1 Adım (olumsuz adımları da, yani. içinde geçme dizide ilginç değilim yineleme ters). Ayrıca keyfi noktaları, uzunluğu sadece 0 dan bir geçiş ilgilenmiyorum. Ben de 1000'den fazla anahtarları düzenli olarak oluyor ile manipüle diziler görmüyorum, ama bir dizi bir uygulama mantığı, birden çok kez geçilen görüyorum. Operasyon, büyük ölçüde tek dize işleme ve eko olanaksızdır da.

İşte birkaç referans siteleri:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php

Ben her yerde duyuyorum:

  • foreach yavaş, ve böylece for/while daha hızlı
  • PHPs foreach kopya dizi yineler; daha hızlı yapmak için başvuruları kullanmak gerekir
  • bu gibi kod: $key = array_keys($aHash); $size = sizeOf($key);
    for ($i=0; $i < $size; $i )
    foreach daha hızlı

İşte benim sorunum. Bu test script yazdım: http://pastebin.com/1ZgK07US senaryo çalıştırmak nasıl, böyle bir şey olsun: olursa olsun

foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801

Kısacası:

  • foreach referans foreach daha hızlı
  • foreach daha hızlı for daha
  • foreach karma tablo için for daha hızlı

Biri bana açıklayabilir mi?

  1. Yanlış bir şey mi yapıyorum?
  2. PHP referans şey gerçekten bir fark yaratmak dosyalarda grup? Yani neden eğer başvuru başarılı olursa, kopya değil mi?
  3. Ne eşdeğer yineleyici kodu foreach deyimi; gördüm bir kaç net ama her zaman ben onları test zamanlama uzakta; ben de test bir kaç basit yineleyici oluşturur ama asla görünmek bile iyi sonuçlar -- dizi kullanımına PHP? korkunç
  4. /Yöntemleri oluşturur ama bir dizi/FOREACH (SÜRE) İÇİN dışında dolaşmak için/daha hızlı bir yolu var mı?

PHP Sürüm 5.3.0 < / ^ hr . Edit: Cevap Buradaki insanların yardımıyla her soru için cevapları bir araya getirmeyi başardı. Onları burada özetlemek istiyorum:

  1. "Yanlış bir şey mi yapıyorum?"Uzlaşma gibi görünüyor: Evet, kriterler. echo kullanamam Şahsen ben hala anlamadım nasıl yankı bazı fonksiyon ile rasgele zaman yürütme ya da nasıl başka bir işlevi olduğunu bir şekilde farklı ... ... ve yeteneği bu komut sadece üretmek aynı sonuçları dosyalarda grup için her şeyi daha iyi olduğunu açıklamak zor ama sadece "kullanıyorsun echo" (Peki ne yapmalıyım ben kullanıyorum). Ancak, bu test daha iyi bir şey yapılması gerektiğini kabul ediyorum; ama ideal bir uzlaşma aklıma gelmiyor.
  2. "Dosyalarda grup tanıklığından PHP gerçekten bir fark yaratıyor? Yani neden eğer başvuru başarılı olursa, kopya değil mi?"ircmaxell Evet daha fazla test referans kodu yukarıda benim parçacığını göz önüne alındığında, çoğu kesinlikle kötü değil ama daha hızlı olmalıdır çoğu durumda kanıtlamak gibi görünüyor olduğunu göstermektedir. Sorun muhtemelen sezgisel olmayan derecede rahatsız etmek için her zaman çok daha iyidir aslında her durum için belirlemek için bir şey vermeyeceksiniz gibi aşırı ihtiyaç olacağını kabul ediyorum.
  3. "Ne denk yineleyici kodu foreach deyimi; gördüm bir kaç net ama her zaman ben onları test zamanlama uzakta; ben de test bir kaç basit yineleyici oluşturur ama asla görünmek bile iyi sonuçlar -- dizi kullanımına PHP? korkunç"ircmaxell cevap feryat sağladı; ama bu kod sadece PHP sürümü ^ için geçerli olabilir . = 5
  4. "/Yöntemleri oluşturur ama bir dizi/FOREACH (SÜRE) İÇİN dışında dolaşmak için/daha hızlı bir yolu var mı?"Cevap için teşekkürler Gordon gidin. PHP5 yeni veri türleri kullanarak bir performans artışı veya bellek artırmak ya da arzu edilen bir duruma da bağlı olabilir () vermelidir. Hız bilge ise dizinin yeni türleri bir sürü dizi daha iyi olacak gibi görünmüyor(), splpriorityqueue ve splobjectstorage önemli ölçüde daha hızlı gibi görünüyor. Bağlantı Gordon tarafından sağlanan: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/

Sana yardım etmeye çalışan herkese teşekkür ederim.

Büyük olasılıkla herhangi bir basit geçişi için dosyalarda grup (referans olmayan sürüm) tercih ederim.

CEVAP
7 AĞUSTOS 2010, CUMARTESİ


Benim kişisel görüşüm bu bağlamda mantıklı kullanmaktır. Şahsen ben neredeyse hiç dizi geçişi için for kullanın. Yineleme diğer türleri için kullanıyorum, ama foreach çok kolay... zaman farkı çoğu zaman çok az olacak.

İzlemek için büyük bir şey

for ($i = 0; $i < count($array); $i  ) {

Her yineleme sayısı çağırıyor beri pahalı döngü. Bunları yapmadığın sürece, gerçekten önemli olduğunu sanmıyorum...

Başvuru bir fark yaratmak için PHP kullanır-kopya-yazma, eğer diziye yazarsan eğer, döngü sırasında nispeten daha az yük olacaktır. Ancak, eğer başlamadan değiştirme içinde dizi dizi, bu nerede olacak görülmeye başlayan farklılıklar arasında (bu yana bir ihtiyaç kopya tüm dizi ve başvuru yapabilirsiniz sadece değiştirmek içi)...

Bu kullanımına yönelik olarak, foreach eşittir:

$it->rewind();
while ($it->valid()) {
    $key = $it->key();     // If using the $key => $value syntax
    $value = $it->current();

    // Contents of loop in here

    $it->next();
}

Daha hızlı yol yapmak için orada olmak kadar, gerçekten sorun bağlıdır. Ama gerçekten sormak istiyorum, neden? İşleri daha verimli hale getirmek için anlarım, ama mikro-optimizasyon için zamanını boşa harcıyorsun bence. , 23* *... hatırla

Düzenleme:Açıklama dayalı, hızlı kriter bir çalışma yapmaya karar verdim

$a = array();
for ($i = 0; $i < 10000; $i  ) {
    $a[] = $i;
}

$start = microtime(true);
foreach ($a as $k => $v) {
    $a[$k] = $v   1;
}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => &$v) {
    $v = $v   1;
}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => $v) {}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => &$v) {}    
echo "Completed in ", microtime(true) - $start, " Seconds\n";

Ve sonuçları:

Completed in 0.0073502063751221 Seconds
Completed in 0.0019769668579102 Seconds
Completed in 0.0011849403381348 Seconds
Completed in 0.00111985206604 Seconds

Eğer döngü içinde diziyi iseniz, birkaç kat daha hızlı başvurular için...

Ve sadece referans yükü aslında kopyalama daha az dizi (5.3.2)... başvurular, önemli ölçüde daha hızlı gibi görünüyor (5.3.2 en az)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • EvilControllers

    EvilControll

    20 Ocak 2008
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006