Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于字符串连接的JavaScript虚拟机优化_Javascript - Fatal编程技术网

基于字符串连接的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年前的,因此没有意义

您可以在jsperf.com上进行自己的js性能测试。例如,这似乎表明它与现代浏览器无关。@James:是的,看起来我是正确的(花了很短的时间),但仍然对全局智慧的答案感到好奇。我的问题更多的是关于声明行中的串联。对现代JS引擎的优化可能是微不足道的。@BreakPhreak你是什么意思?在第一次声明对象的行中(如我的示例中),之后不会发生变化。“我说得够清楚了吗?”BreakPhreak说,没什么区别。这
varx;x=
相当于这个
var x=