Saya mencoba memberikan gambaran luas dengan jawaban ini.
Pikiran berikut dalam kurung adalah keyakinan saya sampai saya baru saja menguji masalah ini:
[[Dalam hal bahasa tingkat rendah seperti C / C ++ , kode dikompilasi sehingga prosesor memiliki perintah lompat kondisional khusus ketika sebuah variabel nol (atau tidak nol).
Juga, jika Anda peduli tentang banyak optimasi ini, Anda bisa pergi ++i
bukan i++
karena ++i
merupakan perintah prosesor tunggal sedangkan i++
sarana j=i+1, i=j
.]]
Loop sangat cepat dapat dilakukan dengan membuka gulungannya:
for(i=800000;i>0;--i)
do_it(i);
Ini bisa jadi lebih lambat dari pada
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
tetapi alasan untuk ini bisa sangat rumit (hanya untuk menyebutkan, ada masalah preprocessing perintah prosesor dan penanganan cache dalam game).
Dalam hal bahasa tingkat tinggi , seperti JavaScript saat Anda bertanya, Anda dapat mengoptimalkan berbagai hal jika Anda mengandalkan perpustakaan, fungsi bawaan untuk perulangan. Biarkan mereka memutuskan cara terbaik untuk melakukannya.
Akibatnya, dalam JavaScript, saya akan menyarankan menggunakan sesuatu seperti
array.forEach(function(i) {
do_it(i);
});
Ini juga lebih rentan kesalahan dan browser memiliki kesempatan untuk mengoptimalkan kode Anda.
[KETINGGALAN: tidak hanya browser, tetapi Anda juga memiliki ruang untuk mengoptimalkan dengan mudah, cukup mendefinisikan kembali forEach
fungsi (tergantung browser) sehingga menggunakan tipuan terbaik terbaru! :) @AMK mengatakan dalam kasus khusus layak menggunakan array.pop
atau array.shift
. Jika Anda melakukannya, letakkan di balik tirai. The maksimal berlebihan adalah dengan menambahkan pilihan untuk forEach
memilih algoritma perulangan.]
Selain itu, juga untuk bahasa tingkat rendah, praktik terbaik adalah menggunakan beberapa fungsi pustaka pintar untuk operasi yang rumit dan berulang jika memungkinkan.
Pustaka-pustaka itu juga dapat meletakkan hal-hal (multi-threaded) di belakang Anda dan juga pemrogram khusus membuat mereka tetap terbarui.
Saya melakukan sedikit pemeriksaan lebih lanjut dan ternyata di C / C ++, bahkan untuk operasi 5e9 = (50,000x100,000), tidak ada perbedaan antara naik dan turun jika pengujian dilakukan terhadap konstanta seperti kata @alestanis. (Hasil JsPerf kadang-kadang tidak konsisten tetapi pada umumnya mengatakan hal yang sama: Anda tidak dapat membuat perbedaan besar.)
Jadi --i
kebetulan itu menjadi hal yang "mewah". Itu hanya membuat Anda terlihat seperti programmer yang lebih baik. :)
Di sisi lain, untuk membuka gulungan dalam situasi 5e9 ini, itu membuat saya turun dari 12 detik menjadi 2,5 detik ketika saya naik 10 detik, dan 2,1 detik ketika saya pergi 20 tahun. Itu tanpa optimasi, dan optimasi telah membawa segalanya ke waktu yang tidak terukur. :) (Membuka gulungan dapat dilakukan dengan cara saya di atas atau menggunakan i++
, tetapi itu tidak membawa hal-hal di depan dalam JavaScript.)
Semua dalam semua: pertahankan i--
/ i++
dan ++i
/ i++
perbaiki wawancara pekerjaan, tetap pada array.forEach
atau fungsi perpustakaan kompleks lainnya jika tersedia. ;)