Hari ini, saya membaca utas ini tentang kecepatan penggabungan string.
Anehnya, rangkaian string adalah pemenangnya:
Hasilnya berlawanan dengan apa yang saya pikirkan. Selain itu, ada banyak artikel tentang ini yang menjelaskan sebaliknya seperti ini .
Saya dapat menebak bahwa browser dioptimalkan untuk merangkai concat
pada versi terbaru, tetapi bagaimana mereka melakukannya? Bisakah kita mengatakan bahwa lebih baik digunakan +
saat menggabungkan string?
Memperbarui
Jadi, di browser modern penggabungan string dioptimalkan sehingga menggunakan +
tanda lebih cepat daripada menggunakan join
saat Anda ingin menggabungkan string.
Tapi @Arthur menunjukkan itu join
lebih cepat jika Anda benar-benar ingin menggabungkan string dengan pemisah.
Pembaruan -
Chrome 2020 : Array join
hampir seperti 2 times faster
String concat +
Lihat: https://stackoverflow.com/a/54970240/984471
Sebagai catatan:
- Array
join
lebih baik jika Anda punyalarge strings
- Jika kita perlu menghasilkan
several small strings
dalam keluaran akhir, lebih baik menggunakan string concat+
, karena jika tidak menggunakan Array akan membutuhkan beberapa konversi Array ke String pada akhirnya yang merupakan kelebihan kinerja.
sumber
Jawaban:
Mesin javascript V8 (digunakan di Google Chrome) menggunakan kode ini untuk melakukan penggabungan string:
Jadi, secara internal mereka mengoptimalkannya dengan membuat InternalArray (
parts
variabel), yang kemudian diisi. Fungsi StringBuilderConcat dipanggil dengan bagian ini. Ini cepat karena fungsi StringBuilderConcat adalah kode C ++ yang sangat dioptimalkan. Terlalu panjang untuk mengutip di sini, tapi cari di file runtime.cc untukRUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat)
melihat kodenya.sumber
arr.join vs str+
di chrome Anda mendapatkan (dalam operasi per detik)25k/s vs 52k/s
. di firefox baru Anda dapatkan76k/s vs 212k/s
. begitustr+
juga CEPAT. tapi mari kita lihat browser lain. Opera memberikan 43k / s vs 26k / s. IE memberi1300/s vs 1002/s
. lihat apa yang terjadi? satu - satunya browser yang MEMBUTUHKAN pengoptimalan akan lebih baik menggunakan apa yang lebih lambat di semua yang lain, di mana itu tidak masalah sama sekali. Jadi, Tak satu pun dari artikel itu yang memahami apa pun tentang kinerja.Firefox cepat karena menggunakan sesuatu yang disebut Ropes ( Ropes: an Alternative to Strings ). Tali pada dasarnya hanyalah DAG, di mana setiap Node adalah string.
Jadi misalnya, jika Anda mau
a = 'abc'.concat('def')
, objek yang baru dibuat akan terlihat seperti ini. Tentu saja ini tidak persis seperti yang terlihat di memori, karena Anda masih perlu memiliki bidang untuk jenis string, panjang dan mungkin lainnya.Dan
b = a.concat('123')
Jadi dalam kasus yang paling sederhana, VM hampir tidak melakukan pekerjaan apa pun. Satu-satunya masalah adalah ini memperlambat operasi lain pada string yang dihasilkan sedikit. Juga ini tentu saja mengurangi overhead memori.
Di sisi lain
['abc', 'def'].join('')
biasanya hanya akan mengalokasikan memori untuk meletakkan string baru dalam memori. (Mungkin ini harus dioptimalkan)sumber
Saya tahu ini utas lama, tetapi pengujian Anda salah. Anda melakukan
output += myarray[i];
sementara itu seharusnya lebih sepertioutput += "" + myarray[i];
karena Anda lupa, bahwa Anda harus merekatkan barang menjadi satu dengan sesuatu. Kode concat harus seperti ini:Dengan begitu, Anda melakukan dua operasi, bukan satu karena elemen merekatkan bersama.
Array.join()
lebih cepat.sumber
"" +
dan Original?output
tanpa itu.Array.join(",")
yang tidak akan berfungsi denganfor
loop AndaUntuk jumlah data yang besar, penggabungan lebih cepat, jadi pertanyaannya salah.
Diuji di Chrome 72.0.3626.119, Firefox 65.0.1, Edge 42.17134.1.0. Perhatikan bahwa ini lebih cepat bahkan dengan pembuatan array disertakan!
sumber
Tolok ukurnya ada yang sepele. Menggabungkan tiga item yang sama berulang kali akan menjadi sebaris, hasilnya akan terbukti deterministik dan memoized, sampah handler hanya akan membuang objek array (yang ukurannya hampir tidak ada) dan mungkin hanya mendorong dan mengeluarkan tumpukan karena tidak ada referensi eksternal dan karena string tidak pernah berubah. Saya akan lebih terkesan jika pengujiannya adalah sejumlah besar string yang dibuat secara acak. Seperti dalam satu atau dua pertunjukan string.
Array. Bergabunglah dengan FTW!
sumber
Saya akan mengatakan bahwa dengan string lebih mudah untuk mengalokasikan buffer yang lebih besar. Setiap elemen hanya 2 byte (jika UNICODE), jadi meskipun Anda konservatif, Anda dapat mengalokasikan buffer yang cukup besar untuk string. Dengan
arrays
setiap elemen lebih "kompleks", karena setiap elemen adalahObject
, jadi implementasi konservatif akan mengalokasikan ruang untuk lebih sedikit elemen.Jika Anda mencoba menambahkan
for(j=0;j<1000;j++)
sebelum masing-masing,for
Anda akan melihat bahwa (di bawah chrome) perbedaan kecepatan menjadi lebih kecil. Pada akhirnya itu masih 1,5x untuk penggabungan string, tetapi lebih kecil dari 2,6 yang sebelumnya.DAN harus menyalin elemen, karakter Unicode mungkin lebih kecil dari referensi ke Objek JS.
Sadarilah bahwa ada kemungkinan bahwa banyak implementasi mesin JS memiliki pengoptimalan untuk array tipe tunggal yang akan membuat semua yang saya tulis tidak berguna :-)
sumber
Tes ini menunjukkan hukuman sebenarnya menggunakan string yang dibuat dengan penggabungan tugas vs dibuat dengan metode array.join. Meskipun kecepatan keseluruhan penugasan masih dua kali lebih cepat di Chrome v31 tetapi tidak lagi sebesar saat tidak menggunakan string yang dihasilkan.
sumber
Ini jelas tergantung pada implementasi mesin javascript. Bahkan untuk versi berbeda dari satu mesin Anda bisa mendapatkan hasil yang sangat berbeda. Anda harus melakukan patokan Anda sendiri untuk memverifikasi ini.
Saya akan mengatakan itu
String.concat
memiliki kinerja yang lebih baik di versi terbaru V8. Namun untuk Firefox dan Opera,Array.join
adalah pemenangnya.sumber
Dugaan saya adalah bahwa, sementara setiap versi mengenakan biaya banyak penggabungan, versi gabungan juga membangun array.
sumber