【问题标题】:How to manage arguments如何管理争论
【发布时间】:2015-02-23 09:36:52
【问题描述】:

如果我在使用搜索引擎方面做得不好并且已经得到解答,我会提前道歉。在这种情况下,请为我指明正确的方向。

我最近开始在函数中使用 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;
}

你得到你想要的参数,并且没有进行切片。所以从我的角度来看,你不会在这方面失去任何东西,也许它会使用一些额外的内存并且速度会稍微慢一些,但并没有真正发挥作用,对吧?

只是想知道我这里的逻辑是否有缺陷。

【问题讨论】:

  • 将arguments 传递给另一个函数也会阻止优化。所以这和切片一样糟糕。
  • 这种微优化对大多数程序没有太大的影响。我只是切片然后收工。
  • 同意@elclanrs。不用担心,在你写超高负载的程序之前,用slice就行了,听说浏览器优化就够了。

标签: javascript arguments


【解决方案1】:

这是discuss

这里是introduction

例如here 使用内联切片

【讨论】:

    【解决方案2】:

    从@Eason 发布的讨论中(here)看来,争论属于“微优化”类别,即:我们大多数人永远不会遇到这些性能障碍,因为我们的代码没有通过甚至需要出现在雷达上的那种迭代。

    这是一个很好的总结:

    像这样的微优化总是需要权衡取舍 代码的复杂性/可读性与其性能之间。

    在许多情况下,复杂性/可读性更为重要。在这种情况下, 经过测试的最慢方法的运行时间为 4.3 微秒。如果您正在编写 Web 服务并且正在切片 args 每个请求两次,然后做 100 毫秒的其他工作,一个 额外的 0.0086 毫秒不会引起注意,不值得花时间或 要优化的代码污染。

    这些优化在您遇到无数次的非常热的循环中最有帮助。用一个 profiler 找到你的热门代码,并首先优化你最热门的代码, 直到你取得的成绩令人满意为止。

    我很满意,并且会使用Array.prototype.slice.call(),除非我检测到指向该特定代码段没有达到 V8 优化器的性能波动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      相关资源
      最近更新 更多