2014 While
kembali
Berpikir logis saja.
Lihat ini
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Harus membuat setidaknya 2 variabel (indeks, panjang)
- Perlu memeriksa apakah indeks lebih kecil dari panjangnya
- Perlu meningkatkan indeks
- yang
for
loop 3 parameter
Sekarang katakan padaku mengapa ini harus lebih cepat daripada:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Satu variabel
- Tanpa cek
- indeks berkurang (Mesin lebih suka itu)
while
hanya memiliki satu parameter
Saya benar-benar bingung ketika Chrome 28 menunjukkan bahwa for loop lebih cepat daripada sementara. Ini pasti punya semacam
"Eh, semua orang menggunakan for loop, mari kita fokus pada itu ketika mengembangkan untuk chrome."
Tapi sekarang, pada 2014 loop sementara kembali pada chrome. ini 2 kali lebih cepat, di browser lain / yang lebih lama selalu lebih cepat.
Akhir-akhir ini saya membuat beberapa tes baru. Sekarang di dunia nyata, kode-kode pendek itu tidak bernilai apa-apa dan jsperf tidak dapat benar-benar mengeksekusi loop sementara, karena perlu membuat ulang array. Panjang yang juga membutuhkan waktu.
Anda TIDAK BISA mendapatkan kecepatan aktual loop sementara di jsperf.
Anda perlu membuat fungsi kustom Anda sendiri dan memeriksanya window.performance.now()
Dan ya ... tidak mungkin loop sementara hanya lebih cepat.
Masalah sebenarnya adalah manipulasi dom / rendering waktu / waktu menggambar atau bagaimana pun Anda ingin menyebutnya.
Misalnya saya punya adegan kanvas di mana saya perlu menghitung koordinat dan tabrakan ... ini dilakukan antara 10-200 MicroSeconds (bukan milidetik). sebenarnya dibutuhkan berbagai milidetik untuk membuat semuanya. Sama seperti di DOM.
TAPI
Ada cara super performan lain menggunakan untuk loop
dalam beberapa kasus ... misalnya untuk menyalin / mengkloning array
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Perhatikan pengaturan parameter:
- Sama seperti pada while loop saya hanya menggunakan satu variabel
- Perlu memeriksa apakah indeks lebih besar dari 0;
- Seperti yang Anda lihat pendekatan ini berbeda vs normal untuk semua orang menggunakan loop, karena saya melakukan hal-hal di dalam parameter ke-3 dan saya juga mengurangi langsung di dalam array.
Mengatakan itu, ini menegaskan bahwa mesin seperti -
menulis bahwa saya berpikir untuk membuatnya sedikit lebih pendek dan menghapus beberapa barang yang tidak berguna dan menulis yang ini menggunakan gaya yang sama:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Bahkan jika lebih pendek sepertinya menggunakan i
sekali lagi memperlambat segalanya. Ini 1/5 lebih lambat dari for
loop sebelumnya dan while
satu.
Catatan: yang ;
sangat penting setelah untuk looo tanpa{}
Bahkan jika saya baru saja mengatakan kepada Anda bahwa jsperf bukan cara terbaik untuk menguji skrip .. saya menambahkan 2 loop ini di sini
http://jsperf.com/caching-array-length/40
Dan inilah jawaban lain tentang kinerja dalam javascript
https://stackoverflow.com/a/21353032/2450730
Jawaban ini adalah untuk menunjukkan cara-cara performant dalam menulis javascript. Jadi jika Anda tidak dapat membacanya, tanyakan dan Anda akan mendapatkan jawaban atau membaca buku tentang javascript http://www.ecma-international.org/ecma-262/5.1/