JavaScript'te dizeleri birleştirmenin en etkili yolu?


163

JavaScript'te, birçok yinelemeye sahip bir döngü var ve her yinelemede, birçok +=operatörle büyük bir dize oluşturuyorum . Dize oluşturmanın daha etkili bir yolu var mı? Burada dizeler eklemeye devam ediyorum ve sonra birleştirme yapmak dinamik bir dizi oluşturma hakkında düşünüyordum. Herkes bunu yapmanın en hızlı yolunu açıklayabilir ve bir örnek verebilir mi?


2
Dizeyi ne için kullanıyorsunuz? Bununla ilgili herhangi bir performans ipucu ortamınıza, dizelerinizin boyutlarına, belirli bir js motorunun farklı işlemleri nasıl optimize ettiğine vb. Göre değişir.
Ben McCormick


5
Bu bağlantıyı kontrol edin jsperf.com/join-concat/2
rab

IE9 kullanıyorum ama IE8 uyumluluk modunda (ki değiştiremiyorum). Büyük dize jquery kullanarak DOM içine ekleyeceğim bir şeydir.
omega

Yanıtlar:


135

JSPerf'deki ölçütlere dayanarak, +=her tarayıcıda zorunlu olarak kullanılmamasının en hızlı yöntem olduğu görülmektedir.

DOM'de dizeler oluşturmak için, önce dizeyi birleştirmek ve daha sonra DOM'a eklemek, daha sonra yinelemeli olarak dom'a eklemek daha iyi görünüyor . Yine de kendi davanızı karşılaştırmalısınız.

(Düzeltme için teşekkürler @zAlbee)


1
Bağlantı verilen sayfaya bakın. +=Bir dizide birleştirme ve birleştirme yapmak arasında çok az fark var gibi görünüyor .
Jakub Hampl

Her dize için DOM'a 66%eklemek, bir dize oluşturmaktan ve daha sonra dizeyi DOM'a eklemekten daha hızlıdır (IE9 için).
omega

bağlantılı sayfa her iki test için de + = kullanır, görünürde .join () yoktur, bu nedenle gürültüyü yalnızca "fark" olarak gösteren anlamsız bir testtir. gürültülü js olsa nasıl iyi bir örnek ... dom dize daha yavaş, bu yüzden idareli kullanın.
dandavis

Zaman sadece bir bileşendir. Yinelemeli rutinler için, GC'ye çeşitli yöntemler arasındaki etkinin ne olduğunu merak ediyorum?
David Bradley

Dizeye concat çok tatsız bellek böcek nedeniyle büyük dizeleri için Array.join tercih edilebilir bugs.chromium.org/p/v8/issues/detail?id=3175
MWAG

70

Birleştirmenin kendisi hakkında hiçbir yorumum yok, ama @Jakub Hampl'in önerisine dikkat çekmek istiyorum:

DOM'de dizeler oluşturmak için, bazı durumlarda DOM'a yinelemeli olarak eklemek, daha sonra aynı anda büyük bir dize eklemek daha iyi olabilir.

yanlış, çünkü kusurlu bir teste dayanıyor. Bu test gerçekten DOM'a eklenmez.

Bu sabit test , dizeyi oluşturmadan önce bir kerede oluşturmanın çok daha hızlı olduğunu göstermektedir. Bu bir yarışma bile değil.

(Üzgünüz, bu ayrı bir cevap, ancak henüz cevaplar hakkında yorum yapmak için yeterli temsilcim yok.)


4
Bir test ve bir sonuç içerdiğinden (test başka bir cevaba dayandırılmış / esinlenilmiş olmasına rağmen, bu iyi olmalı) çünkü kendi başına bir cevap olmaya değer olduğunu düşünüyorum, üzgünüm gerek yok.
user202729

14

Bu sorunun yanıtlanmasından bu yana üç yıl geçti ama yine de cevabımı vereceğim :)

Aslında, kabul edilen cevap tam olarak doğru değildir. Jakub'un testi, JS motorunun kod yürütmesini optimize etmesini sağlayan sabit kodlu dize kullanıyor (Google'ın V8'i bu konuda gerçekten iyi!). Ama tamamen rastgele dizeler ( burada JSPerf ) kullandığınız anda dize birleştirme ikinci bir yerde olacaktır.


İlginçtir, Windows makinemdeki Chrome 54 ve Firefox 45 ile, concat, sürümünüzü kullanan diğer ikisinin iki katından daha hızlıdır. IE 11, diğer üç tarayıcıdaki concat olmayanlar kadar yavaştır.
ShawnFumo

4
Sürümden sürüme farklıdır. Sanırım şu anda Chrome'un VM'si bu durum için bazı ön optimizasyon içerebilir. Chrome v53'te tekrar test ettim ve birleştirme artık en hızlı çözüm: D Aynı donanım ancak farklı Chrome sürümü tamamen farklı sonuçlar veriyor.
Volodymyr Usarskyy

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.