Her şeyden önce:
do-while
Döngü, bir döngü while
veya döngü ile aynı şey değildir for
.
while
ve for
döngüler, döngü gövdesini hiç çalıştırmayabilir.
- Bir
do-while
dö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 while
veya for
dö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 for
olduklarından, döngülerden tekrar bahsetmeyeceğim while
.
Bu yüzden soruyu cevaplayacağım:
Bir while
döngünün en az bir kez döngü yapması garanti edilirse , do-while
bunun 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-while
dö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-while
dö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 while
ve arasında mantıksal bir fark yoktur do-while
.
FWIW, bunu Visual Studio 2012'de test ettim:
Boş gövdeyle, aslında while
ve 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-while
genel 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.)