Apa yang dikatakan guru Anda adalah pernyataan miring tanpa banyak klarifikasi. BUKAN bahwa pengurangan lebih cepat daripada menambah tetapi Anda dapat membuat loop jauh lebih cepat dengan penurunan daripada dengan kenaikan.
Tanpa panjang lebar tentang hal itu, tanpa perlu menggunakan penghitung lingkaran dll - yang penting di bawah ini hanya kecepatan dan jumlah loop (bukan nol).
Inilah cara kebanyakan orang menerapkan loop dengan 10 iterasi:
int i;
for (i = 0; i < 10; i++)
{
//something here
}
Untuk 99% kasus, semua itu mungkin diperlukan tetapi bersama dengan PHP, PYTHON, JavaScript ada seluruh dunia perangkat lunak penting (biasanya tertanam, OS, game, dll.) Di mana kutu CPU sangat penting, jadi lihat sebentar pada kode perakitan:
int i;
for (i = 0; i < 10; i++)
{
//something here
}
setelah kompilasi (tanpa optimasi) versi kompilasi mungkin terlihat seperti ini (VS2015):
-------- C7 45 B0 00 00 00 00 mov dword ptr [i],0
-------- EB 09 jmp labelB
labelA 8B 45 B0 mov eax,dword ptr [i]
-------- 83 C0 01 add eax,1
-------- 89 45 B0 mov dword ptr [i],eax
labelB 83 7D B0 0A cmp dword ptr [i],0Ah
-------- 7D 02 jge out1
-------- EB EF jmp labelA
out1:
Seluruh loop adalah 8 instruksi (26 byte). Di dalamnya - sebenarnya ada 6 instruksi (17 byte) dengan 2 cabang. Ya ya saya tahu ini bisa dilakukan dengan lebih baik (ini hanya sebuah contoh).
Sekarang pertimbangkan ini sering membangun yang sering Anda temukan ditulis oleh pengembang tertanam:
i = 10;
do
{
//something here
} while (--i);
Itu juga berulang 10 kali (ya saya tahu saya nilainya berbeda dibandingkan dengan yang ditunjukkan untuk loop tetapi kami peduli dengan iterasi yang dihitung di sini). Ini dapat dikompilasi menjadi ini:
00074EBC C7 45 B0 01 00 00 00 mov dword ptr [i],1
00074EC3 8B 45 B0 mov eax,dword ptr [i]
00074EC6 83 E8 01 sub eax,1
00074EC9 89 45 B0 mov dword ptr [i],eax
00074ECC 75 F5 jne main+0C3h (074EC3h)
5 instruksi (18 byte) dan hanya satu cabang. Sebenarnya ada 4 instruksi di loop (11 byte).
Yang terbaik adalah bahwa beberapa CPU (termasuk x86 / x64 termasuk) memiliki instruksi yang dapat mengurangi register, kemudian membandingkan hasil dengan nol dan melakukan cabang jika hasilnya berbeda dari nol. Hampir semua PC CPU menerapkan instruksi ini. Menggunakannya, loop sebenarnya hanya satu (ya satu) instruksi 2 byte:
00144ECE B9 0A 00 00 00 mov ecx,0Ah
label:
// something here
00144ED3 E2 FE loop label (0144ED3h) // decrement ecx and jump to label if not zero
Apakah saya harus menjelaskan mana yang lebih cepat?
Sekarang bahkan jika CPU tertentu tidak mengimplementasikan instruksi di atas semua yang diperlukan untuk meniru itu adalah penurunan diikuti oleh lompatan bersyarat jika hasil dari instruksi sebelumnya adalah nol.
Jadi, terlepas dari beberapa kasus yang Anda tunjukkan sebagai komentar mengapa saya salah, dll, saya menekankan. - YA BERMANFAAT UNTUK MELIHAT KE BAWAH KE BAWAH jika Anda tahu bagaimana, mengapa dan kapan.
PS. Ya saya tahu bahwa kompiler bijak (dengan tingkat optimasi yang sesuai) akan menulis ulang untuk loop (dengan counter loop menaik) menjadi do..sementara setara untuk iterasi loop konstan ... (atau membuka gulungannya) ...