Rumah  >  Artikel  >  hujung hadapan web  >  Rantaian Kaedah: penapis().map() tidak cekap?

Rantaian Kaedah: penapis().map() tidak cekap?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-05 12:17:02933semak imbas

Kaedah Rantaian

Anda mungkin pernah melihat kod menggunakan Array.prototype.filter() dan Array.prototype.map() untuk mengedit dan mengalih keluar nilai dalam data Array dalam Javascript

Contohnya:

[1,2,3]
.map((mapped) => mapped + 1)
.filter((filtered) => filtered > 1)

soalan

Saya sentiasa tertanya-tanya sama ada perantaian kaedah seperti itu melelaran nilai dalam tatasusunan pada setiap lelaran atau enjin v8 mungkin mengoptimumkan operasi dengan melakukan pengagregatan data di bawah hud.

Jadi saya menjalankan penyelidikan kecil.

Bagaimana?

Menggunakan console.time dan console.timeEnd dan mengukur purata masa pelaksanaan dalam 10 kali dengan dan tanpa Rantaian Kaedah.
Saya menggunakan penyemak imbas Chrome untuk penyiasatan.

console.time('Filter Execution Time')
// YOUR CODE
console.timeEnd('Filter Execution Time')

Keputusan: Kaedah Chaining tidak mengagregatkan operasi.

- Method Chain(A) No Method Chain(B) Aggregate Logic(C)
Iterate 10000000 values 4656 ms 4733 ms 169 ms
Iterate 100000 values 27 ms 24 ms 4 ms

Seperti yang anda lihat, keputusan dengan/tanpa Rantaian Kaedah tidak mendedahkan banyak perbezaan, manakala logik agregat mencapai hasil yang lebih pantas.

Kod-A. Gunakan Kaedah Rantaian dengan peta() dan penapis()

console.time('Filter Execution Time')
const result = new Array()
.fill(1).map((e) => e + 1)
.filter((e) => e !== 1)
console.timeEnd('Filter Execution Time')

Kod-B. Asingkan peta() dan penapis() (Tiada Kaedah Rantaian)

console.time('Filter Execution Time')
const mapResult = new Array().fill(1).map((e) => e + 1)
const result = mapResult.filter((e) => e !== 1)
console.timeEnd('Filter Execution Time')

Kod-C. Logik agregat

console.time('Filter Execution Time')
const result = []
new Array().fill(1).forEach((e) =>  {
    if (e !== 1) result.push(e)
})
console.timeEnd('Filter Execution Time')

Tetapi Rangkaian Kaedah berguna bukan?

Bagi mereka yang berpendapat demikian, saya membuat carta pada setiap bilangan lelaran daripada 100 hingga 100,000 di bawah Corak Kod A, B dan C dengan mengira purata masa mengikut milisaat dalam 10 kali, begitu juga seperti di atas.

Penemuan

  1. Tidak banyak perbezaan apabila bilangan lelaran tidak besar seperti 100 - 1,000 pula.

  2. Ia akan menjadi masalah apabila bilangan lelaran meningkat secara eksponen seperti 1,000,000.

Method Chain: filter().map() is inefficient?

Kesimpulan

Perantaian Kaedah tidak mengagregatkan operasi manakala perbezaan keputusan semakin meluas apabila bilangan lelaran meningkat secara eksponen.

Oleh itu, saya fikir adalah adil untuk mengatakan bahawa apabila bilangan lelaran adalah kecil, tidak mengapa menggunakan rantaian kaedah untuk mendapatkan kelebihan kebolehgunaannya, sebaliknya, jika anda berurusan dengan sejumlah besar data, anda harus pertimbangkan algoritma dengan teliti tanpa rantai kaedah.

Terima kasih kerana membaca!

Atas ialah kandungan terperinci Rantaian Kaedah: penapis().map() tidak cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn