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

Mary-Kate Olsen
Lepaskan: 2024-11-05 12:17:02
asal
858 orang telah melayarinya

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)
Salin selepas log masuk

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')
Salin selepas log masuk

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')
Salin selepas log masuk

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')
Salin selepas log masuk

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')
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!