【问题标题】:What is the most accurate way to test the computation speed of a function in JavaScript?在 JavaScript 中测试函数计算速度的最准确方法是什么?
【发布时间】:2013-12-29 03:52:22
【问题描述】:

我需要比较一些代码的计算速度,但我不确定最好的方法是什么。是否有某种内置计时器可以做到这一点?是否有可能获得以纳秒为单位的计算速度,还是我需要处理 JavaScript 通常使用的毫秒数?

【问题讨论】:

    标签: javascript performance performance-testing


    【解决方案1】:

    我遇到了performance API。你要找的可能是Performance.now(),它会给你微秒级的精度。

    Performance.now() 方法返回一个DOMHighResTimeStamp,测量 以毫秒为单位,精确到千分之一毫秒,等于 自PerformanceTiming.navigationStart 以来的毫秒数 属性和对方法(source).的调用

    MDN 提供的示例是:

    var t0 = performance.now();
    doSomething();
    var t1 = performance.now();
    console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.")
    

    您可以用来多次测试特定短代码的性能的函数,您可以使用以下函数:

    /**
     * Finds the performance for a given function
     * function fn the function to be executed
     * int n the amount of times to repeat
     * return array [time elapsed for n iterations, average execution frequency (executions per second)]
     */
    function getPerf(fn, n) {
      var t0, t1;
      t0 = performance.now();
      for (var i = 0; i < n; i++) {
        fn(i)
      }
      t1 = performance.now();
      return [t1 - t0, repeat * 1000 / (t1 - t0)];
    }
    

    返回单次执行fn(i) 所花费的时间(以毫秒为单位)和执行频率(每秒执行次数)。 n 值越高,精度越高,但测试时间越长。参数i 可以包含在要测试的函数中,其中包含函数的当前迭代。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 这仍然以毫秒为单位,但这看起来就像一个内置的调试功能,所以我想我必须处理毫秒并运行循环多一点迭代。
      【解决方案3】:

      您应该使用jsPerf 来获得具有统计意义的结果。由于浏览器中涉及各种 JIT 系统,性能结果可能会有很大差异,因此 jsPerf 或它使用的 Benchmarking.js 库将根据需要多次运行您的代码以获得良好的结果。但请注意,如果一个函数仅在几纳秒内运行,则几乎总是没有必要担心它的性能。

      【讨论】:

        【解决方案4】:

        您可以尝试浏览器内置的分析功能:

        它们功能丰富,无需编写任何代码即可开箱即用

        【讨论】:

          【解决方案5】:

          您可以使用 Internet Explorer 的 Developer Tools Script Profiler。我相信 Chrome 和 Firefox 也有类似的工具。它会在几毫秒内给你。但是如果花费的时间少于一毫秒,那么我认为它也会以纳秒为单位显示。

          【讨论】:

            【解决方案6】:

            另一个工具是 https://github.com/anywhichway/benchtest,它只是重复使用 Mocha 单元测试。

            【讨论】:

              猜你喜欢
              • 2010-09-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-26
              • 2015-02-01
              • 2017-02-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多