'var _args = arguments'作为优化缺陷

时间:2016-01-08 20:24:19

标签: javascript node.js v8

我想知道是否使用arguments

    var _args = arguments;
    arr.forEach(function (val, i) {
        arr[i] = _args[i]; 
    });

对优化造成不利影响。

严格来说,它不符合任何these optimization killers但不符合规则

  

不要在没有.length或[i]

的情况下直接使用参数

任一。在这种情况下,在低级别究竟发生了什么?

JS内部是问题的主题,并且数组迭代的特定实现不是。

1 个答案:

答案 0 :(得分:0)

"永远不要使用没有[i]或.length"参数不是关于性能,而是直接关于arguments对象的黑魔法。

在所有JS引擎的所有版本的所有实现中,无法告诉您发生了什么,因为它'特定于实现。

它的接口有规则,但不是围绕驱动接口的代码的实现。

参数(或任何别名)的定义行为本身会根据您是否处于严格模式而改变,因此性能考虑因素不仅取决于您是处于严格模式还是松散模式,而且还取决于引擎在两个代码路径中的实现。

创建指向arguments的别名(不是从arguments构建的数组)实际上根本不会有太大帮助。 它不会帮助人类维持它;它不会帮助运行它的大多数引擎。 它仍然需要表现出与直接引用arguments相同的神奇行为(因此具有相同的性能含义)(同样,基于严格或松散的操作而不同)。

这就是为什么如果你想对魔法元素(arguments live NodeList等等的实例)做任何事情,你应该将它们的内容放入数组或对象。因为每次访问它们时都需要为访问/修改这些魔术盒中的元素付出代价。

唯一的方法来说明每个引擎,每个引擎版本,每个浏览器,每个设备的成本是多少...... ...就是在所有这些事情上测试它们,期望唯一一致的事实是访问/修改数组内部的元素将比访问/修改魔法实时列表中的元素快得多。 / p>

修改

此外,在审阅了您在评论中链接的蓝鸟维基部分之后,黑魔法正是 他们 在您提供的信息中指的是。

function add (a, b) {
  return a + b;
}


function unsafeAdd (a, b) {
  arguments[1] = 12;
  return a + b;
}


function safeAdd (a, b) {
  "use strict";
  arguments[1] = 41;
  return a + b;
}


add(1, 2); // 3
unsafeAdd(1, 2); // 42
safeAdd(1, 2); // 3

这与速度提升("优化")无关,更多的是与保护免受愚蠢(或聪明的无意识副作用)有关。 但同样,只要查看safeAddunsafeAdd之间的行为差​​异,就应该看到为什么效果也会发生变化。