Saya belajar dari buku bahwa Anda harus menulis untuk loop seperti ini :
for(var i=0, len=arr.length; i < len; i++){
// blah blah
}
jadi arr.length
tidak akan dihitung setiap waktu.
Yang lain mengatakan bahwa kompiler akan melakukan beberapa optimasi untuk ini, jadi Anda bisa menulis:
for(var i=0; i < arr.length; i++){
// blah blah
}
Saya hanya ingin tahu yang mana cara terbaik dalam latihan?
javascript
performance
loops
wong2
sumber
sumber
for ... of
perulangan ke kompetisi ini? Sintaks tampaknya lebih mudah daripada loop untuk tanpa caching, dan saya ingin tahu apakah saya harus beralih menggunakan untuk loop.Jawaban:
Setelah melakukan tes ini dengan sebagian besar browser modern ...
http://jsben.ch/dyM52
Saat ini , bentuk loop tercepat (dan menurut saya yang paling jelas secara sintaksis).
standar untuk loop dengan caching panjang
Saya akan mengatakan ini jelas merupakan kasus di mana saya memuji pengembang mesin JavaScript. Waktu berjalan harus dioptimalkan untuk kejelasan , bukan kepintaran .
sumber
++i
.for(var i=0, len=myArray.length; i<len; ++i)
Periksa jsperf.com/caching-array-length/84var
pernyataan. Bagaimana itu ditulis,len
sebenarnya dicakup seperti yang Anda sarankan.Cara tercepat mutlak untuk mengulang melalui javascript array adalah:
Lihat http://blogs.oracle.com/greimer/entry/best_way_to_code_a untuk perbandingan lengkap
sumber
var
(yang lainlen
menjadi variabel global). Juga, lihat jsperf.com/loops untuk lebih banyak benchmark loop.Pada Juni 2016 , melakukan beberapa tes di Chrome terbaru (71% dari pasar browser pada Mei 2016, dan meningkat):
Saya percaya utas ini terlalu lama dan itu adalah programer menyesatkan untuk berpikir mereka perlu panjang cache, atau menggunakan reverse traversing sementara dengan pengurangan untuk mencapai kinerja yang lebih baik, menulis kode yang kurang terbaca dan lebih rentan terhadap kesalahan daripada mudah untuk loop sederhana. Karena itu, saya merekomendasikan:
Jika aplikasi Anda berulang pada banyak item atau kode loop Anda ada di dalam fungsi yang sering digunakan, jawaban langsung untuk loop adalah jawabannya:
Jika aplikasi Anda tidak benar-benar beralih melalui banyak item atau Anda hanya perlu melakukan iterasi kecil di sana-sini, menggunakan standar untuk setiap panggilan balik atau fungsi serupa dari perpustakaan JS pilihan Anda mungkin lebih mudah dimengerti dan lebih rentan terhadap kesalahan, karena lingkup variabel indeks ditutup dan Anda tidak perlu menggunakan tanda kurung, mengakses nilai array secara langsung:
Jika Anda benar-benar perlu menggaruk beberapa milidetik saat iterasi lebih dari miliaran baris dan panjang array Anda tidak berubah melalui proses, Anda mungkin mempertimbangkan untuk caching panjang dalam for loop Anda. Meskipun saya pikir ini benar-benar tidak perlu saat ini:
sumber
for(let i=0, j=array.length; i < j; i++)
, maju untuk loop mempercepat jauh. Pada beberapa tes saya menjalankannya menang, pada sebagian besar itu berada dalam margin of error atau loop terbalik.Jika urutannya tidak penting, saya lebih suka gaya ini:
Tembolok itu panjangnya dan jauh lebih pendek untuk menulis. Tapi itu akan beralih ke array dalam urutan terbalik.
sumber
i--
Mengembalikan nomor dan sekali nomor0
kondisi adalahfalse
karenaBoolean(0) === false
.Ini hanya 2018 sehingga pembaruan bisa menyenangkan ...
Dan saya benar-benar harus tidak setuju dengan jawaban yang diterima . Ini berlaku pada browser yang berbeda. beberapa melakukan
forEach
lebih cepat, beberapafor-loop
, dan beberapa diwhile
sini adalah patokan pada semua metode http://jsben.ch/mW36edan karena Anda dapat melihat banyak for-loop seperti
for(a = 0; ... )
layak untuk disebutkan bahwa tanpa variabel 'var' akan didefinisikan secara global dan ini dapat secara dramatis mempengaruhi kecepatan sehingga akan menjadi lambat.Perangkat Duff berjalan lebih cepat di opera tetapi tidak di firefox
sumber
2014
While
kembaliBerpikir logis saja.
Lihat ini
for
loop 3 parameterSekarang katakan padaku mengapa ini harus lebih cepat daripada:
while
hanya memiliki satu parameterSaya 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.
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 arrayPerhatikan pengaturan parameter:
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:
Bahkan jika lebih pendek sepertinya menggunakan
i
sekali lagi memperlambat segalanya. Ini 1/5 lebih lambat darifor
loop sebelumnya danwhile
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/
sumber
for
lebih cepat daripadawhile
, dan saya pernah membaca di crome-dev itu persis karena alasan yang Anda sebutkan. Itu hanya masalah waktu sebelumwhile
akan menyusul lagi. Sejak saat itu, logika di bagian pertama dari jawaban Anda akan berlaku (sekali lagi, ya)! Namun implementasi modern tidak lagi kaku mengikuti setiap langkah yang ditentukan ecma (mereka mengoptimalkan). Karena sekarang mesin Anda bukan lagi leher botol yang paling mencolok, kini Anda dapat benar-benar menyadari bahwa cache-misses CPU dalam loop terbalik !http://jsperf.com/caching-array-length/60
Revisi terbaru dari tes, yang saya siapkan (dengan menggunakan yang lama), menunjukkan satu hal.
Panjang cache tidak terlalu penting, tetapi tidak berbahaya.
Setiap pengujian pertama yang ditautkan di atas (pada tab yang baru dibuka) memberikan hasil terbaik untuk 4 cuplikan terakhir (bagan 3, 5, 7 dan 10) di Chrome, Opera dan Firefox di Debian Squeeze 64-bit ( perangkat keras desktop saya) ). Berjalan berikutnya memberikan hasil yang sangat berbeda.
Kesimpulan kinerja-bijaksana sederhana:
!==
bukan<
.shift()
-ing array juga efisien.tl; dr
Saat ini (2011.10) di bawah pola terlihat menjadi yang tercepat.
Perlu diingat bahwa caching
arr.length
tidak penting di sini, jadi Anda bisa mengujii !== arr.length
dan kinerjanya tidak turun, tetapi Anda akan mendapatkan kode yang lebih pendek.PS: Saya tahu bahwa dalam cuplikan dengan
shift()
hasilnya dapat digunakan alih-alih mengakses elemen 0, tetapi saya entah bagaimana mengabaikannya setelah menggunakan revisi sebelumnya (yang salah ketika loop), dan kemudian saya tidak ingin kehilangan hasil yang sudah didapat.sumber
"Terbaik" seperti dalam kinerja murni? atau kinerja DAN keterbacaan?
Kinerja murni "terbaik" adalah ini, yang menggunakan cache dan operator awalan ++ (data saya: http://jsperf.com/caching-array-length/189 )
Saya berpendapat bahwa cache-less untuk-loop adalah keseimbangan terbaik dalam waktu eksekusi dan waktu membaca programmer. Setiap programmer yang memulai dengan C / C ++ / Java tidak akan menyia-nyiakan ms harus membaca yang ini
sumber
len
namanya, seseorang harus selalu melakukan pengambilan ganda pada loop pertama itu. Niat loop kedua jelas.** cache panjang array di dalam loop, beberapa detik waktu akan dihilangkan. Tergantung pada item dalam array jika ada lebih banyak item dalam array ada perbedaan besar sehubungan dengan Ms waktu *
**
**
**
**
sumber
Ini tampaknya menjadi cara tercepat sejauh ini ...
Mempertimbangkan bahwa ini akan mengkonsumsi array, memakannya, dan tidak meninggalkan apa pun ...
sumber
arr.shift();
alih-aliharr.pop()
agar array terbalik dapat dihindari.Ini tahun 2017 .
Saya melakukan beberapa tes.
https://jsperf.com/fastest-way-to-iterate-through-an-array/
Sepertinya
while
metode ini adalah yang tercepat di Chrome.Tampak seperti penurunan kiri (
--i
) jauh lebih cepat dari yang lain (++i
,i--
,i++
) di Firefox.Pendekatan ini adalah puasa rata-rata. Tapi iterates array dalam urutan terbalik.
Jika urutan ke depan penting, gunakan pendekatan ini.
sumber
let
Anda sebenarnya membandingkan kinerja pembuatan lingkup alih-alih kinerja loop. Menggunakanlet i = 0, ii = array.length
dalamfor
loop Anda akan membuat ruang lingkup baru untuk variabel-variabel di dalamfor
blok.while
Contoh Anda tidak membuat ruang lingkup baru untuk variabel di dalamwhile
blok dan itu sebabnya mereka lebih cepat. Jika Anda menggunakanvar
alih-alihlet
di dalam untuk loop, Anda akan melihat bagaimana loop masih secepat di 2017, tetapi lebih mudah dibaca.var
danlet
memiliki kinerja yang sama - stackoverflow.com/a/32345435/1785975while
lebih cepat di Chrome" akurat. Hanya jika menggunakanlet
karena masalah kinerja kata kunci di Chrome. Jika menggunakanvar
atau dengan browser lain,for
danwhile
hampir sama, kadangfor
- kadang bahkan lebih cepat tergantung dari tolok ukur, dan itu lebih kompak dan mudah dibaca.Saya selalu menulis dengan gaya pertama.
Sekalipun kompiler cukup pintar untuk mengoptimalkannya untuk array, tapi tetap pintar jika kita menggunakan DOMNodeList di sini atau objek rumit dengan panjang yang dihitung?
Saya tahu apa pertanyaannya tentang array, tetapi saya pikir ini adalah praktik yang baik untuk menulis semua loop Anda dalam satu gaya.
sumber
i ++ lebih cepat dari ++ i, --i dan i--
Anda juga dapat menyimpan baris terakhir dengan melakukan arr [i ++] terakhir kali Anda perlu mengakses i (tetapi ini bisa sulit untuk di-debug).
Anda dapat mengujinya di sini (dengan tes putaran lainnya): http://jsperf.com/for-vs-whilepop/5
sumber
++i
lebih cepat ...Pada September 2017 , tes jsperf ini menunjukkan pola berikut sebagai yang paling berkinerja di Chrome 60:
Adakah yang bisa mereproduksi?
sumber
Saya telah mencoba beberapa cara lain untuk mengulangi array besar dan menemukan bahwa mengurangi separuh panjang array dan kemudian mengulangi kedua bagian dalam satu lingkaran lebih cepat. Perbedaan kinerja ini dapat dilihat saat memproses array besar .
Beberapa perbandingan kinerja (menggunakan timer.js) antara panjang cache untuk-loop VS metode di atas.
http://jsfiddle.net/tejzpr/bbLgzxgo/
sumber
Tes jsperf.com lain: http://jsperf.com/while-reverse-vs-for-cached-length
Loop sebaliknya sementara tampaknya menjadi yang tercepat. Satu-satunya masalah adalah bahwa sementara (--i) akan berhenti pada 0. Lalu bagaimana saya bisa mengakses array [0] di loop saya?
sumber
while (i--)
maka kejujurani
akan diuji sebelum menurunkan daripada mengurangi dan kemudian menguji kebenaran.Loop sementara dasar seringkali merupakan yang tercepat. jsperf.com adalah kotak pasir yang bagus untuk menguji jenis konsep ini.
https://jsperf.com/fastest-array-loops-in-javascript/24
sumber
Sedangkan loop sedikit lebih cepat daripada untuk loop.
Gunakan while loop sebagai gantinya
sumber
Pendekatan tercepat adalah tradisional untuk loop. Berikut ini perbandingan kinerja yang lebih komprehensif.
https://gists.cwidanage.com/2019/11/how-to-iterate-over-javascript-arrays.html
sumber
Solusi paling elegan yang saya tahu adalah menggunakan peta.
sumber
Coba ini:
sumber
Cara tercepat untuk mengulang dalam array adalah dengan menggunakan filter. Metode filter () membuat array baru dengan semua elemen yang lulus tes diimplementasikan oleh fungsi yang disediakan.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
Dari pengalaman saya, saya selalu lebih suka filter, peta dll.
sumber
Pada 2019 WebWorker telah lebih populer, untuk dataset besar, kita dapat menggunakan WebWorker untuk memproses jauh lebih cepat dengan sepenuhnya memanfaatkan prosesor multi-core.
Kami juga memiliki Parallel.js yang membuat WebWorker lebih mudah digunakan untuk pemrosesan data.
sumber