SORU
7 NİSAN 2014, PAZARTESİ


Süre arasındaki fark(true) ve for(;;) PHP de?

while(true) ve sözdizimi ve okunabilirlik ayrıca for(;;) PHP arasında herhangi bir fark var mı?

Edit: bu bir yinelenen asla kabul etmezdim - cevap PHP için özel olduğunu bilmek istiyorum. Herhangi bir gerçek fark altyapısı ile ilgili olarak var mı? Aynı şeyi derlemek için? Eşit performans var mı?

Edit 2: Ayrıca göreceli performans ve ilişkili İşlem kodları görüşüne göre olabileceğini düşünün. Okunabilirlik bir görüş için bir alan vardır, ama bu açıkça bir soru değildir.

CEVAP
7 NİSAN 2014, PAZARTESİ


Tamam, Öncelikle şunu söylemek istiyorum.En semantik anlam verir while(true) kullanın. Sık gördüğüm bir şey değil gibi for (;;) ayrıştırmak gerekir.

Bunu dedi, hadi bir göz atalım:

İşlem kodları

Kod

while(true) {
    break;
}
echo "hi!";

Derler işlem kodları için:

0: JMPZ(true, 3)
1: BRK(1, 3)
2: JMP(0)
3: ECHO("hi!")

Yani Kısacası, "gerçek", ve, yankı işlem kodu olan 4 işlem kodu atlar değilse). eğer bir kontrol yapar Tatili o zaman gerçekten sadece 4 işlem kodu için statik bir atlama (). Sonra döngünün sonuna koşulsuz atlama orijinal kontrol etmek için geri olurdu

Karşılaştırın:

for (;;) {
    break;
}
echo "hi!";

Derler aşağı:

0: JMPZNZ(true, 2, 4)
1: JMP(0)
2: BRK(1, 4)
3: JMP(1)
4: ECHO("hi!")

Hemen for(;;) sürümünde ekstra bir işlem kodu olduğunu görebiliriz.

İşlem Kodu Tanımları

JMPZ(durum, pozisyon)

Bu işlem kodu ise durumu false ise atlar. Eğer ** 16 yaşında, o ise hiçbir şey ama önceden bir işlem kodu yok.

JMPZNZ(koşul, pos1, pos2)

Bu işlem kodu eğer koşul doğruysa, ve eğer koşul yanlışsa pos2 pos1 atlar.

Hafıza yerinin(pozisyonu)

Bu işlem kodu her zaman belirtilen konuma yeni bir işlem kodu için atlar.

BRK(düzey, pozisyon)

Bu position işlem kodu level seviyeleri keser

ECHO(dizi)

Çıkışları dize

Bu İkisi Aynı Şey

- İşlem kodları bakarak, aynı değil bu açık. == ama ===. while(true) döngü koşullu atlama kodu koşulsuz bir sıçrama tarafından takip ediyor. for(;;) döngü koşullu atlama, kod, koşulsuz bir sıçrama ardından, başka bir koşulsuz atlama takip ediyor. Ekstra bir sıçrama yapar.

Opcache

5.5, opcache olan Doktoru bölümünde olacak optimize static conditional jumps.

while(true) kod optimize vardır:

0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")

Ve for(;;) döngü olur:

0: BRK(1, 2)
1: JMP(0)
2: ECHO("hi!")

Bu doktoru bulmak ve atlama zincirlerini optimize olacak çünkü. Eğer 5.5-dahili kullanıyorsanız opcache, aynı olacaktır

Dikkat

Bu tam anlamıyla bir mikro-optimizasyon üzerinde karar tabanı. Okunabilir bir kullanın. Performansa dayalı bir kullanımı yok. Fark var, ama kayda değer değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007
  • gsmaestro

    gsmaestro

    17 AĞUSTOS 2006
  • Liz Morgan

    Liz Morgan

    4 Aralık 2011