基于字符串连接的JavaScript虚拟机优化
前一段时间,类似以下声明的定义是性能差:基于字符串连接的JavaScript虚拟机优化,javascript,Javascript,前一段时间,类似以下声明的定义是性能差: var a = "my" + "very" + "very" + "long" + "string" + "and" + "even" + "longer"; 我被告知,每个后续的+操作都会导致创建一个额外的字符串,因为它们是不可变的。至少有一次,这在Java编程语言中是一个问题(注意StringBuffervs.String) 当然,我说的是浏览器的最新版本 现在的问题是关于JavaScript:是否仍然不推荐使用它,或者运行时可以在毫秒内解决(或
var a = "my" +
"very" +
"very" +
"long" +
"string" +
"and" +
"even" +
"longer";
我被告知,每个后续的+
操作都会导致创建一个额外的字符串,因为它们是不可变的。至少有一次,这在Java编程语言中是一个问题(注意StringBuffer
vs.String
)
当然,我说的是浏览器的最新版本
现在的问题是关于JavaScript:是否仍然不推荐使用它,或者运行时可以在毫秒内解决(或者我应该说优化)上述问题,而不会产生任何性能开销?如果要串联大量字符串值,这会更有意义:
str = [
'string1',
'string2',
'string3',
'string4',
'etc.'
].join( '' );
我刚刚发现了一个使用JavaScript的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());
资料来源:以下几点:
- 您提到的在Java中从来都不是性能问题;编译器总是使用
对其进行优化。只有在循环中附加到变量时才会出现问题StringBuffer
- Java和JavaScript完全没有任何关系
- JavaScript运行时必须非常努力地对问题进行优化,直到需要毫秒。在现代CPU上,毫秒是永恒的
- 过早优化。不要
- 优化前的概要文件/基准测试。这是一个例子,但请注意,结果是3年前的,因此没有意义
varx;x=
相当于这个var x=代码>。