SORU
24 Kasım 2013, Pazar


Derleyiciler do-while döngüleri döngüler karşı diğer türleri için daha iyi kod üretmek?

C do-while döngüsü "" kod çoğu derleyici. iyi üretir anlamına gelir zlib compression library diğerleri arasında Krom projede kullanılan) bir yorum var Burada göründüğü kod parçacığını.

do {
} while (*(ushf*)(scan =2) == *(ushf*)(match =2) &&
         *(ushf*)(scan =2) == *(ushf*)(match =2) &&
         *(ushf*)(scan =2) == *(ushf*)(match =2) &&
         *(ushf*)(scan =2) == *(ushf*)(match =2) &&
         scan < strend);
/* The funny "do {}" generates better code on most compilers */

https://code.google.com/p/chromium/codesearch#chromium/src/third_party/zlib/deflate.c&l=1225

En (veya herhangi bir) Derleyiciler (daha verimli gibi) daha iyi kod oluşturmak herhangi bir kanıt var mı?

Güncelleme:Mark Adler, özgün yazarlarından biri, gave a bit of context yorumlar.

CEVAP
24 Kasım 2013, Pazar


Öncelikle:

do-while döngü whiledöngü veya fordöngü olarak aynı değildir.

  • while for döngüler döngü bloğu hiç çalışmayabilir.
  • ** 12 döngü her zaman en az bir kez döngü vücut çalışır - ilk koşulu atlar.

Mantıklı bir fark var. Bu, herkes kesinlikle bu yapışır " dedi. while for Her zaman döngü olduğunu garanti en az bir kez bile kullanılacak döngüler oldukça sık rastlanan bir durumdur. (Özellikle foreach ile dillerinde döngüler.)

Yani elma ve portakal karşılaştırarak önlemek için döngü en az bir kez çalışır varsayarak devam edeceğim. Ayrıca, aslında bir döngü sayacı için sözdizimi birazcık şekerle while döngüler olduğundan for döngüler bir daha söz etmeyeceğim.

Soruya cevap verdim.:

Eğer while bir döngü için döngü en az bir kez garanti edilirse, yerine do-while bir döngü kullanarak herhangi bir performans artışı var.


do-while ilk koşul kontrol atlar. Bir daha az şube ve değerlendirmek için bir koşul daha var.

Durumunu kontrol etmek için pahalı, ve döngü en az bir kez garantili olduğunuzu biliyorsanız, o zaman do-while bir döngü daha hızlı olabilir.

Ve bu kabul edilir bir mikro-optimizasyon en iyi ihtimalle, bir derleyici yok her zaman: Özellikle zaman derleyici mümkün olmadığını ... döngü hep girin en az bir kez.


Diğer bir deyişle, döngü: bir

while (condition){
    body
}

Etkili bu aynıdır:

if (condition){
    do{
        body
    }while (condition);
}

Her zaman en az bir kez döngü olduğunu biliyorsanız,-açıklama gereksiz.


Aynı şekilde Meclis düzeyinde, bu farklı döngüler derlemek için nasıl kabaca:

do-while döngüsü:

start:
    body
    test
    conditional jump to start

döngü:

    test
    conditional jump to end
start:
    body
    test
    conditional jump to start
end:

Bu durum yinelenen unutmayın. Alternatif bir yaklaşım

    unconditional jump to end
start:
    body
end:
    test
    conditional jump to start

... hangi esnaf için kod yinelenen ek bir sıçrama.

Her iki şekilde de, do-while normal bir döngü daha hala kötü.

Bu, Compiler ne isterlerse yapabilirler " dedi. Ve eğer döngü her zaman bir kez girdiği kanıtlanırsa, o zaman sizin için işi vardır.


Ama işler boş döngü bir vücut olduğu için, söz konusu belirli bir örnek için biraz garip. Vücut yok bu yana, while do-while arasında mantıksal bir fark yok.

FWIW, Visual Studio 2012 bu test:

  • Boş bedenle, while do-while için aynı kodu yok aslında. Bu kısmı büyük olasılıkla Derleyiciler gibi güzel değildi, ne zaman eski günlerden kalma.

  • Ama boş olmayan bir vücut ile, VS2012 durum kod tekrarından kaçınmak için yönetir, ama yine de oluşturur ekstra koşullu bir sıçrama.

Yani ironik olan ise örnekte soru olayları neden bir do-while döngü olabilir daha hızlı genel durum, örnek kendisi gibi görünmüyor vermek fayda modern bir derleyici.

Yorum nasıl düşünüyor, sadece o konuda niçin tahmin edebiliriz. Zamanda Derleyiciler cesedi boş olduğunu fark etme kapasitesine sahip olmadığını çok mümkün. Ya da yaparlarsa, bilgi kullanmadılar.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • andony5589

    andony5589

    7 Aralık 2011
  • Julia Graf

    Julia Graf

    6 Mayıs 2006
  • listedabive

    listedabive

    30 Ocak 2007