2011-11-16 51 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