Pertama-tama:
Sebuah do-while
loop tidak sama dengan awhile
-loop atau for
-loop.
while
dan for
loop mungkin tidak menjalankan badan loop sama sekali.
- SEBUAH
do-while
lingkaran selalu berjalan tubuh loop setidaknya sekali - itu melompat kondisi pemeriksaan awal.
Jadi itulah perbedaan logisnya. Meskipun demikian, tidak semua orang benar-benar mematuhi ini. Biasanya for while
or for
loop digunakan bahkan jika dijamin akan selalu melakukan loop setidaknya sekali. (Terutama dalam bahasa dengan foreach loop.)
Jadi untuk menghindari membandingkan apel dan jeruk, saya akan melanjutkan dengan asumsi bahwa loop akan selalu berjalan setidaknya sekali. Selanjutnya, saya tidak akan menyebutkanfor
loop lagi karena mereka pada dasarnya adalah while
loop dengan sedikit gula sintaks untuk penghitung loop.
Jadi saya akan menjawab pertanyaan:
Jika sebuah while
loop dijamin untuk melakukan loop setidaknya sekali, apakah ada keuntungan performa dari penggunaan ado-while
loop sebagai gantinya.
SEBUAH do-while
melewatkan pemeriksaan kondisi pertama. Jadi ada satu cabang yang kurang dan satu kondisi yang kurang untuk dievaluasi.
Jika kondisinya mahal untuk diperiksa, dan Anda tahu bahwa Anda dijamin akan melakukan loop setidaknya sekali, maka a do-while
loop bisa lebih cepat.
Dan meskipun ini dianggap sebagai pengoptimalan mikro, ini adalah salah satu yang tidak selalu dapat dilakukan oleh kompilator: Secara khusus ketika kompilator tidak dapat membuktikan bahwa perulangan akan selalu masuk setidaknya sekali.
Dengan kata lain, loop sementara:
while (condition){
body
}
Secara efektif sama dengan ini:
if (condition){
do{
body
}while (condition);
}
Jika Anda tahu bahwa Anda akan selalu mengulang setidaknya sekali, pernyataan if itu asing.
Demikian juga di tingkat perakitan, ini kira-kira bagaimana loop yang berbeda dikompilasi ke:
do-while loop:
start:
body
test
conditional jump to start
while-loop:
test
conditional jump to end
start:
body
test
conditional jump to start
end:
Perhatikan bahwa kondisi tersebut telah diduplikasi. Pendekatan alternatifnya adalah:
unconditional jump to end
start:
body
end:
test
conditional jump to start
... yang menukar kode duplikat untuk lompatan tambahan.
Bagaimanapun, ini masih lebih buruk daripada do-while
loop normal .
Konon, penyusun dapat melakukan apa yang mereka inginkan. Dan jika mereka dapat membuktikan bahwa loop selalu masuk sekali, maka itu berhasil untuk Anda.
Tetapi hal-hal agak aneh untuk contoh tertentu dalam pertanyaan karena memiliki badan loop kosong. Karena tidak ada tubuh, tidak ada perbedaan logis antara while
dando-while
.
FWIW, saya menguji ini di Visual Studio 2012:
Dengan badan kosong, itu sebenarnya menghasilkan kode yang sama untuk while
dan do-while
. Jadi bagian itu kemungkinan merupakan sisa dari masa lalu ketika kompiler tidak sehebat itu.
Tetapi dengan isi yang tidak kosong, VS2012 berhasil menghindari duplikasi kode kondisi, tetapi masih menghasilkan lompatan bersyarat tambahan.
Jadi ironis bahwa meskipun contoh dalam pertanyaan menyoroti mengapa do-while
perulangan bisa lebih cepat dalam kasus umum, contoh itu sendiri tampaknya tidak memberikan manfaat apa pun pada kompiler modern.
Mempertimbangkan berapa umur komentar itu, kita hanya bisa menebak mengapa itu penting. Sangat mungkin bahwa penyusun pada saat itu tidak dapat mengenali bahwa tubuh itu kosong. (Atau jika mereka melakukannya, mereka tidak menggunakan informasi tersebut.)