Apakah filter lebih cepat daripada foreach javascript?

Suatu kali, kami mewawancarai kandidat posisi developer menengah yang tidak dapat menjawab pertanyaan sederhana yang melibatkan loop while. Dia menjelaskan bahwa dia hanya menulis kode deklaratif, dan tidak ada gunanya lagi pemrograman imperatif. Sementara kami sebagian setuju, itu membuat kami berpikir. “haruskah pemrogram selalu memilih .map,

array.forEach((x) => {
   x.r = x.a + x.b;
});
0, dan
array.forEach((x) => {
   x.r = x.a + x.b;
});
1 metode Array daripada loop sederhana dalam JavaScript?”

Gaya pemrograman deklaratif sangat ekspresif, lebih mudah ditulis, dan jauh lebih mudah dibaca. Lebih baik 99% dari waktu, tetapi tidak ketika kinerja penting. Loop biasanya tiga kali atau lebih lebih cepat daripada rekan deklaratifnya. Itu tidak menambah perbedaan yang signifikan di sebagian besar aplikasi. Namun, saat memproses data dalam jumlah besar di beberapa aplikasi intelijen bisnis, pemrosesan video, perhitungan ilmiah, atau mesin game, ini akan berdampak besar pada kinerja secara keseluruhan.

Kami telah menyiapkan beberapa tes untuk menunjukkannya. Semua kode tersedia di GitHub. Jangan ragu untuk bermain-main dengannya

Kami akan senang umpan balik dan kontribusi Anda

Daftar isi

Tentang tes

Aplikasi pengujian menggunakan pustaka benchmark untuk mendapatkan hasil yang signifikan secara statistik. Masukan untuk tes adalah larik satu juta objek dengan struktur

array.forEach((x) => {
   x.r = x.a + x.b;
});
2. Inilah kode yang menghasilkan array ini

function generateTestArray() {
  const result = [];
  for (let i = 0; i < 1000000; ++i) {
    result.push({
      a: i,
      b: i / 2,
      r: 0,
    });
  }
  return result;
}

Kami menggunakan laptop Lenovo T480s dengan Intel Core i5-8250, RAM 16Gb yang menjalankan Ubuntu 20. 04 LTS dengan Node v14. 16. 0 untuk mendapatkan hasil

Himpunan. forEach vs untuk dan untuk. dari

Apakah filter lebih cepat daripada foreach javascript?

Operasi per detik, lebih tinggi lebih baik

Tes ini menghitung jumlah

array.forEach((x) => {
   x.r = x.a + x.b;
});
3 dan
array.forEach((x) => {
   x.r = x.a + x.b;
});
4 untuk setiap elemen array dan menyimpannya ke
array.forEach((x) => {
   x.r = x.a + x.b;
});
5

array.forEach((x) => {
   x.r = x.a + x.b;
});

Kami sengaja membuat bidang

array.forEach((x) => {
   x.r = x.a + x.b;
});
5 di objek selama pembuatan array untuk menghindari perubahan struktur objek karena akan memengaruhi tolok ukur

Bahkan dengan pengujian sederhana ini, loop hampir tiga kali lebih cepat. Loop

array.forEach((x) => {
   x.r = x.a + x.b;
});
7 sedikit di depan yang lain, tetapi perbedaannya tidak signifikan. Optimalisasi mikro dari loop
array.forEach((x) => {
   x.r = x.a + x.b;
});
8 yang berfungsi dalam beberapa bahasa lain, seperti menyimpan panjang array dalam cache atau menyimpan elemen untuk akses berulang dalam variabel sementara, tidak memiliki efek apa pun dalam JavaScript yang berjalan di V8. Mungkin V8 sudah melakukannya di bawah tenda

Karena

array.forEach((x) => {
   x.r = x.a + x.b;
});
1 tidak jauh berbeda dari
array.forEach((x) => {
   x.r = x.a + x.b;
});
7 loop, kami tidak melihat banyak gunanya menggunakannya pada loop tradisional dalam banyak kasus. Layak digunakan hanya ketika Anda sudah memiliki fungsi untuk dipanggil pada setiap elemen array. Dalam hal ini, ini adalah one-liner, dengan penurunan kinerja nol

array.forEach(func);

Himpunan. peta vs untuk vs untuk. dari

Operasi per detik, lebih tinggi lebih baik

Tes ini memetakan larik ke larik lain dengan

array.forEach(func);
1 untuk setiap elemen

return array.map((x) => x.a + x.b);

Loop juga jauh lebih cepat di sini.

array.forEach((x) => {
   x.r = x.a + x.b;
});
7 membuat array kosong dan
array.forEach(func);
3-es setiap elemen baru

const result = [];
for (const { a, b } of array) {
   result.push(a + b);
}
return result;

Ini bukan pendekatan yang optimal karena array dialokasikan kembali secara dinamis dan dipindahkan di bawah tenda. Versi

array.forEach((x) => {
   x.r = x.a + x.b;
});
8 melakukan pra-alokasi array dengan ukuran target dan menyetel setiap elemen menggunakan indeks

const result = new Array(array.length);
for (let i = 0; i < array.length; ++i) {
   result[i] = array[i].a + array[i].b;
}
return result;

Di sini, kami juga menguji apakah destrukturisasi berdampak pada kinerja. Dengan .map_, tolok ukurnya identik, dan dengan

array.forEach((x) => {
   x.r = x.a + x.b;
});
7 hasilnya tidak jauh berbeda dan mungkin hanya kebetulan tolok ukur

Himpunan. kurangi vs untuk dan untuk. dari

Operasi per detik, lebih tinggi lebih baik

Di sini kita hanya menghitung jumlah

array.forEach((x) => {
   x.r = x.a + x.b;
});
_3 dan
array.forEach((x) => {
   x.r = x.a + x.b;
});
4 untuk seluruh array

return array.reduce((p, x) => p + x.a + x.b, 0);

Baik

array.forEach((x) => {
   x.r = x.a + x.b;
});
8 dan
array.forEach((x) => {
   x.r = x.a + x.b;
});
7 adalah 3. 5 kali lebih cepat dari
return array.map((x) => x.a + x.b);
_1. Namun, loop jauh lebih bertele-tele

let result = 0;
for (const { a, b } of array) {
   result += a + b;
}
return result;

Menulis bahwa banyak baris kode hanya untuk jumlah sederhana harus memiliki alasan yang kuat, jadi kecuali kinerjanya sangat penting,

array.forEach((x) => {
   x.r = x.a + x.b;
});
0 jauh lebih baik. Tes lagi menunjukkan tidak ada perbedaan antara loop

Kesimpulan

Tolok ukur membuktikan bahwa pemrograman imperatif dengan loop menghasilkan kinerja yang lebih baik daripada menggunakan metode Array yang nyaman. Memanggil fungsi panggilan balik tidak gratis dan bertambah untuk array besar. Namun, untuk kode yang lebih kompleks daripada jumlah sederhana, tidak akan ada banyak perbedaan relatif, karena penghitungannya sendiri akan memakan waktu lebih lama

Kode imperatif jauh lebih bertele-tele dalam banyak kasus. Lima baris kode untuk jumlah yang sederhana terlalu banyak, dan

return array.map((x) => x.a + x.b);
1 hanya satu baris. Di sisi lain,
array.forEach((x) => {
   x.r = x.a + x.b;
});
1 hampir sama dengan
array.forEach((x) => {
   x.r = x.a + x.b;
});
8 atau
array.forEach((x) => {
   x.r = x.a + x.b;
});
7, hanya lebih lambat. Tidak banyak perbedaan kinerja antara kedua loop, dan Anda dapat menggunakan algoritme apa pun yang lebih cocok

Tidak seperti di AssemblyScript, mikro-optimasi dari

array.forEach((x) => {
   x.r = x.a + x.b;
});
8 loop tidak masuk akal untuk array di JavaScript. V8 sudah melakukan pekerjaan dengan baik dan bahkan mungkin menghilangkan pemeriksaan batas juga

Pra-alokasi array dengan panjang yang diketahui jauh lebih cepat daripada mengandalkan pertumbuhan dinamis dengan

array.forEach(func);
3. Kami juga telah mengonfirmasi bahwa penghancuran itu gratis dan harus digunakan kapan pun nyaman

Pengembang yang baik harus mengetahui cara kerja kode dan memilih solusi terbaik dalam setiap situasi. Pemrograman deklaratif, dengan kesederhanaannya, paling sering menang. Menulis kode tingkat rendah hanya masuk akal dalam dua kasus

Mana yang lebih cepat untuk Setiap atau filter dalam JavaScript?

Pertama saya akan menjalankan benchmark dengan 4 metode JS yang paling umum digunakan untuk loop. Seperti yang Anda lihat, forEach memiliki performa terbaik dari 4 . Alasan mengapa forEach lebih cepat daripada peta dan filter adalah karena tidak akan mengembalikan apa pun setelah selesai, hanya tidak terdefinisi tetapi peta dan filter akan mengembalikan array baru.

Apakah filter lebih baik daripada forEach?

Perbedaan utama antara forEach dan filter adalah forEach hanya mengulang array dan mengeksekusi callback tetapi filter mengeksekusi callback dan memeriksa nilai kembaliannya. If the value is true element remains in the resulting array but if the return value is false the element will be removed for the resulting array.

Mana yang lebih cepat untuk Setiap atau kurangi?

Lima baris kode untuk penjumlahan sederhana terlalu banyak, dan pengurangan hanya satu baris. Sebaliknya, . forEach hampir sama dengan for atau for. dari , hanya lebih lambat . Tidak ada banyak perbedaan kinerja antara kedua loop, dan Anda dapat menggunakan algoritme apa pun yang lebih cocok.

Apa loop tercepat dalam JavaScript?

Loop tercepat adalah for loop, baik dengan dan tanpa panjang caching memberikan kinerja yang sangat mirip. .
Loop sementara dengan pengurangan kira-kira 1. 5 kali lebih lambat dari for loop
Sebuah loop menggunakan fungsi panggilan balik (seperti forEach standar), kira-kira 10 kali lebih lambat daripada loop for