Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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_Node.js_Performance - Fatal编程技术网

我应该为内存性能静态分配Javascript字符串吗?

我应该为内存性能静态分配Javascript字符串吗?,javascript,node.js,performance,Javascript,Node.js,Performance,因此,我正在编写这个node.js应用程序,并试图使其速度更快,内存占用更少。我有很多字符串连接,函数如下: function f(pt) { return pt.x + ' + ' + pt.y; } 如果我在应用程序的内部循环上这样做了1亿次,Javascript引擎是否分配并必须释放该字符串'+'1亿次?将此代码重写为以下内容是否会更高效 var plus = ' + '; function f(pt) { return pt.x + plus + pt.y; }

因此,我正在编写这个node.js应用程序,并试图使其速度更快,内存占用更少。我有很多字符串连接,函数如下:

function f(pt) { 
    return pt.x + ' + ' + pt.y; 
}
如果我在应用程序的内部循环上这样做了1亿次,Javascript引擎是否分配并必须释放该字符串
'+'
1亿次?将此代码重写为以下内容是否会更高效

var plus = ' + ';
function f(pt) { 
    return pt.x + plus + pt.y; 
}
或者编译器只是在后台执行这些操作,还是根本不重要?(我的代码实际上使用了比“+”长得多的字符串,我只是以它为例。)

这取决于具体情况

但老实说,它可能会慢一点。
这是因为它必须在函数范围内搜索变量
plus
,然后搜索窗口对象,然后在上面的范围内搜索它

所以,我相信它可能会慢一些

考虑以下代码:

console.time('plus outside');
var plus=' x ', fn=function(pt){return pt.x + plus + pt.y};
for(var i=0; i<1e5; i++){ fn({x:5,y:6}); }
console.timeEnd('plus outside');


加上内部:
fn:
函数(pt){return pt.x++'+pt.y}

加上外部:
fn:
function(pt){return pt.x+plus+pt.y}

数组:
fn:
function(pt){return[pt.x,'+',pt.y].join('''')}

数组(无连接):
fn:
function(pt){return[pt.x,'+',pt.y].join('''')}

阵列(替换COMA):
fn:
函数(pt){return([pt.x,'+',pt.y]+'')。replace('','','')}


将字符串推送到数组上可以加快字符串连接速度。然后加入阵列

["a","b","c"].join('');

这是因为join是一个调用,而且编译器可以立即计算结果字符串的完整长度。

这取决于实现,但至少在V8(Chrome)中,不,每个函数调用似乎都不会实例化一个新的
“+”
。最有可能的是,函数体被编译成一个操作,该操作一次完成串联

您可以通过首先定义一个函数(在控制台中)看到这一点:

然后启动堆探查器并执行以下操作:

var c = f('1', '2');
探查器显示的是,在此期间只分配了一个字符串:

"1 + 2"
这似乎意味着它甚至没有将两个单独的串联操作视为单独的操作。这是一次成功


底线是:像这样的微优化不太可能让你走得更远。正如Ismael所指出的,它实际上可能会减慢代码的速度。

虽然这并不能解决问题,但知道这一点还是很好的。当字符串由许多子字符串组成时也一样:pushS1().pushS2().pushS3()等。(这些fn返回一个对象,其中包含一个数组和这些成员fn)。不知道
控制台.time
控制台.timeEnd
。谢谢。@victorkohl不客气。这种方法比使用两个日期并减去它们要可靠得多。它可以计算到皮秒的时间。我两年前看过这个把戏,我在提姆明很关键的时候用它。遗憾的是,它并非无处不在(例如:IE8)。但这是一个很好的函数,输出时间也很好。我的计算速度快了12.5%,但还是要感谢您的洞察力!几乎做了很多工作,这会使我的代码变慢。@investiciveidio不客气。可以尝试的一件事是在同一范围内设置重复的字符串。由于字符串在Javascript中是不可变的,所以它可能没有多大帮助,但值得一试。
var c = f('1', '2');
"1 + 2"