2011-11-16 50 views
1

前段時間的聲明類似下面被表現不佳定義:的JavaScript虛擬機優化級聯

var a = "my" + 
"very" + 
"very" + 
"long" + 
"string" + 
"and" + 
"even" + 
"longer"; 

有人告訴我,以後每+操作導致創建一個額外的字符串,因爲它們是不可變的。至少,一旦這是Java編程語言的問題(心智StringBufferString)。

我在談論當前瀏覽器的或多或少的最新版本。

現在的問題是關於JavaScript的問題:是否仍然不推薦使用它,或者運行時可能會以毫秒爲單位壓縮(或者應該說優化)上面的問題,而沒有任何性能開銷?

+0

你可以在jsperf.com上做你自己的js性能測試。例如http://jsperf.com/string-concat-js這似乎表明它與現代瀏覽器無關。 – James

+0

@詹姆斯:做到了,看起來我是對的(花了很短的時間),但仍然對全球智慧的答案感到好奇。 – BreakPhreak

回答

0

若干要點:

  • 你引用的東西從來都不是Java中的性能問題;編譯器總是使用StringBuffer對其進行優化。只有在循環中追加變量時纔會出現問題。
  • Java和JavaScript完全沒有關係。
  • JavaScript運行時將必須非常努力地工作到de - 優化問題,直到需要幾毫秒。在現代CPU上,毫秒是永恆的。
  • 不成熟的優化。別。
  • 優化前的配置文件/基準。這裏的numbers from someone who did,但請注意,結果是3歲,因此毫無意義。
2

這更有意義,如果你串聯大量的字符串值:使用JavaScript

str = [ 
    'string1', 
    'string2', 
    'string3', 
    'string4', 
    'etc.' 
].join(''); 
+0

即使在聲明行中? – BreakPhreak

+0

@BreakPhreak你是什麼意思? –

+0

在第一次聲明對象的行(如我的示例中)(以及之後未突變)。我清楚了嗎? – BreakPhreak

0

我只是找到了一個簡單的實現StringBuffer的行爲:

function StringBuffer() { 
    this.buffer = []; 
} 

StringBuffer.prototype.append = function append(string) { 
    this.buffer.push(string); 
    return this; 
}; 

StringBuffer.prototype.toString = function toString() { 
    return this.buffer.join(""); 
}; 

var buf = new StringBuffer(); 

buf.append("hello"); 
buf.append("world"); 

alert(buf.toString()); 

來源:http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/72429b15-73e2-4b4e-9288-9e1dfd47858b/

+1

那麼,我的問題是關於**聲明**行中的連接。那裏的優化可以是現代JS引擎的花生。 – BreakPhreak