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)
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.
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')
- | 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')
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.
Tidak banyak perbezaan apabila bilangan lelaran tidak besar seperti 100 - 1,000 pula.
Ia akan menjadi masalah apabila bilangan lelaran meningkat secara eksponen seperti 1,000,000.
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!