如果我在使用搜索引擎方面做得太糟糕,我会提前道歉,这已经得到了解答。在这种情况下,请指出正确的方向。
我最近开始在函数中使用arguments变量,现在我需要对它进行切片。我看到的每个地方人们都在做这样的事情:
function getArguments(args, start) {
return Array.prototype.slice.call(args, start);
}
根据MDN,这对性能不利:
您不应该对参数进行切片,因为它会阻止JavaScript引擎中的优化(例如V8)。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments
我有没有理由不看到有人做这样的事情:
function getArguments(args, start) {
var i, p = 0;
var len = args.length;
var params = [];
for (i = start; i < len; ++i) {
params[p] = args[i];
p += 1;
}
return params;
}
您可以获得所需的参数,并且不会进行切片。因此,从我的观点来看,你不会在这方面放松一些东西,也许它会使用一点点额外的内存而且稍微慢一些,但是它还没有达到真正有所作为的地步,对吧?
只是想知道我的逻辑是否有缺陷。
答案 0 :(得分:0)
答案 1 :(得分:0)
从@Eason发表的讨论中可以看出,(here)辩论是在&#34;微观化&#34;类别,即:我们大多数人都不会遇到这些性能障碍,因为我们的代码并没有经过甚至出现在雷达上所需的迭代次数。
这里总结了一句好话:
像这样的微优化总是需要权衡 代码的复杂性/可读性和性能之间。
在许多情况下,复杂性/可读性更为重要。在这种情况下, 被测试的非常慢的方法净运行4.3 微秒。如果你正在写一个网络服务而你正在切断args 每个请求两次,然后做100毫秒的其他工作,一个 额外的0.0086毫秒不会引人注意,它不值得花时间或 代码污染优化。
这些优化对于您正在进行数千次激活的热回路非常有用。用一个 探查器找到您的热门代码,并首先优化您最热门的代码, 直到你取得的成绩令人满意。
我很满意,并且会使用Array.prototype.slice.call()
,除非我检测到指向特定代码片段的性能片段没有达到V8优化器。