while (condition) {
...
}
Alur Kerja:
- periksa kondisi;
- jika salah, lompat ke luar loop;
- menjalankan satu iterasi;
- lompat ke atas.
if (condition) do {
...
} while (condition);
Alur Kerja:
- periksa kondisi;
- jika salah, lompat ke luar loop;
- menjalankan satu iterasi;
- periksa kondisi;
- jika benar, lompat ke langkah 3.
Membandingkan keduanya, Anda dapat dengan mudah melihat bahwa yang terakhir mungkin tidak melakukan lompatan sama sekali, asalkan ada tepat satu langkah melalui loop, dan umumnya jumlah lompatan akan menjadi satu kurang dari jumlah iterasi. Mantan harus melompat kembali untuk memeriksa kondisinya, hanya untuk melompat keluar dari lingkaran ketika kondisinya salah.
Lompatan pada arsitektur CPU pipelined modern bisa jadi sangat mahal: karena CPU sedang menyelesaikan eksekusi pemeriksaan sebelum lompatan, instruksi di luar lompatan itu sudah ada di tengah pipeline. Semua pemrosesan ini harus dibuang jika prediksi cabang gagal. Eksekusi lebih lanjut ditunda saat pipa sedang ditegur.
Menjelaskan prediksi cabang yang disebutkan : untuk setiap jenis lompatan bersyarat, CPU memiliki dua instruksi, masing-masing termasuk taruhan pada hasilnya. Misalnya, Anda akan meletakkan instruksi yang mengatakan " lompat jika bukan nol, bertaruh bukan nol " di akhir putaran karena lompatan harus dilakukan pada semua iterasi kecuali yang terakhir. Dengan cara itu CPU mulai memompa pipeline-nya dengan instruksi yang mengikuti target lompat, bukan yang mengikuti instruksi lompat itu sendiri.
Catatan penting
Jangan tidak mengambil ini sebagai contoh bagaimana mengoptimalkan pada tingkat kode sumber. Itu akan salah kaprah karena, seperti yang sudah jelas dari pertanyaan Anda, transformasi dari bentuk pertama ke bentuk kedua adalah sesuatu yang dilakukan oleh compiler JIT sebagai masalah rutin, sepenuhnya sendiri.