Her şeyden önce:
do-whileDöngü, bir döngü whileveya döngü ile aynı şey değildir for.
whileve fordöngüler, döngü gövdesini hiç çalıştırmayabilir.
- Bir
do-whiledöngü her zaman döngü gövdesini en az bir kez çalıştırır - ilk koşul denetimini atlar.
Yani mantıksal fark bu. Bununla birlikte, herkes buna kesinlikle bağlı kalmaz. Bu oldukça yaygındır whileveya fordöngüler o bunun yerine daima döngü en az bir defa garanti bile kullanılır. (Özellikle foreach döngüleri olan dillerde .)
Bu nedenle, elma ve portakalları karşılaştırmaktan kaçınmak için, döngünün her zaman en az bir kez çalışacağını varsayarak devam edeceğim. Dahası, döngü sayacı için bir miktar sözdizimi şekeri içeren döngüler forolduklarından, döngülerden tekrar bahsetmeyeceğim while.
Bu yüzden soruyu cevaplayacağım:
Bir whiledöngünün en az bir kez döngü yapması garanti edilirse , do-whilebunun yerine döngü kullanmaktan herhangi bir performans kazancı olur mu ?
A do-while, ilk durum kontrolünü atlar. Yani, değerlendirilecek bir eksi dal ve bir koşul eksik.
Koşulun kontrol edilmesi pahalıysa ve en az bir kez döngü yapmanın garantili olduğunu biliyorsanız, do-whiledöngü daha hızlı olabilir.
Ve bu en iyi ihtimalle bir mikro optimizasyon olarak kabul edilirken, derleyicinin her zaman yapamayacağı bir şeydir: Özellikle derleyici döngünün her zaman en az bir kez gireceğini kanıtlayamadığında.
Başka bir deyişle, bir while döngüsü:
while (condition){
body
}
Etkin olarak bununla aynıdır:
if (condition){
do{
body
}while (condition);
}
Her zaman en az bir kez döngü yapacağınızı biliyorsanız, bu if-ifadesi gereksizdir.
Aynı şekilde, montaj düzeyinde, farklı döngülerin kabaca şu şekilde derlendiği:
do-while döngüsü:
start:
body
test
conditional jump to start
döngü sırasında:
test
conditional jump to end
start:
body
test
conditional jump to start
end:
Koşulun kopyalandığına dikkat edin. Alternatif bir yaklaşım şudur:
unconditional jump to end
start:
body
end:
test
conditional jump to start
... ek bir sıçrama için yinelenen kodu değiştirir.
Her iki durumda da normal do-whiledöngüden daha kötüdür .
Bununla birlikte, derleyiciler istediklerini yapabilir. Döngünün her zaman bir kez girdiğini kanıtlayabilirlerse, o zaman işi sizin için yapmış demektir.
Ancak sorudaki belirli örnek için işler biraz tuhaf çünkü boş bir döngü gövdesine sahip. Vücut olmadığı için whileve arasında mantıksal bir fark yoktur do-while.
FWIW, bunu Visual Studio 2012'de test ettim:
Boş gövdeyle, aslında whileve için aynı kodu üretir do-while. Yani bu kısım muhtemelen derleyicilerin o kadar iyi olmadığı eski günlerin bir kalıntısıdır.
Ancak boş olmayan bir gövdeyle VS2012, koşul kodunun tekrarlanmasını önlemeyi başarır, ancak yine de fazladan bir koşullu sıçrama oluşturur.
Bu yüzden, sorudaki örnek do-whilegenel durumda bir döngünün neden daha hızlı olabileceğini vurgularken , örneğin modern bir derleyiciye herhangi bir fayda sağlamıyor gibi görünmesi ironiktir .
Yorumun kaç yaşında olduğunu düşünürsek, neden önemli olduğunu ancak tahmin edebiliriz. O sırada derleyicilerin gövdenin boş olduğunu fark edememiş olması çok muhtemeldir. (Veya yaptılarsa, bilgiyi kullanmadılar.)