2012-12-13 17 views
47

Rozumiem, że robi coś jakszybki sposób łączenia ciągów w nodeJS/JavaScript

var a = "hello"; 
a += " world"; 

jest stosunkowo bardzo powolny, jak przeglądarka robi w O(n). Czy jest to szybszy sposób bez instalowania nowych bibliotek?

+4

Nawet jeśli to by było prawdą (że konkatenacja łańcuchów jest bardzo powolna), czy twój kod tak bardzo od niej zależy, że ma znaczenie? – WTK

Odpowiedz

8

Nie ma żadnego innego sposobu w JavaScript do łączenia ciągów.
Można teoretycznie używać .concat(), ale to way slower niż tylko +

biblioteki są nie częściej niż wolniej niż rodzimej JavaScript, zwłaszcza na temat podstawowych operacji, takich jak łączenie strun lub operacji numerycznych.

Po prostu: + jest najszybszy.

14

pytanie jest już odpowiedź, ale kiedy pierwszy raz zobaczyłem to pomyślałem o NodeJS Buffer. Ale jest wolniejszy od +, więc prawdopodobnie nic nie może być szybsze niż + w konketaniu łańcuchów.

Testowane z następującego kodu:

function a(){ 
    var s = "hello"; 
    var p = "world"; 
    s = s + p; 
    return s; 
} 

function b(){ 
    var s = new Buffer("hello"); 
    var p = new Buffer("world"); 
    s = Buffer.concat([s,p]); 
    return s; 
} 

var times = 100000; 

var t1 = new Date(); 
for(var i = 0; i < times; i++){ 
    a(); 
} 

var t2 = new Date(); 
console.log("Normal took: " + (t2-t1) + " ms."); 
for (var i = 0; i < times; i++){ 
    b(); 
} 

var t3 = new Date(); 

console.log("Buffer took: " + (t3-t2) + " ms."); 

wyjściowa:

Normal took: 4 ms. 
Buffer took: 458 ms. 
+1

Za pomocą tego bufora inicjujesz wrapper zawierający ciąg, a następnie budujesz tablicę z 2 owijaczy, dzięki czemu funkcja concatenate przechodzi przez macierz (prawdopodobnie używasz '+ 'aby połączyć łańcuchy) i zwróć go. Myślę, że to tłumaczy, dlaczego bufor jest wolny. – Cerbrus

1

Pytałeś o wydajności. Zobacz: perf test, porównując "concat", "+" i "join" - w skrócie operator + wygrywa zdecydowanie.

Powiązane problemy