【问题标题】:Improve performance of timing method提高计时方法的性能
【发布时间】:2018-04-25 10:56:42
【问题描述】:

我使用这个 nodejs 模块来测量/分析我的应用程序的执行部分需要多长时间。

// polyfill for window.performance.now
var performance = global.performance || {}
var performanceNow =
  performance.now        ||
  performance.mozNow     ||
  performance.msNow      ||
  performance.oNow       ||
  performance.webkitNow  ||
  function(){ return (new Date()).getTime() }

// generate timestamp or delta
// see http://nodejs.org/api/process.html#process_process_hrtime
function hrtime(previousTimestamp){
  var clocktime = performanceNow.call(performance)*1e-3
  var seconds = Math.floor(clocktime)
  var nanoseconds = Math.floor((clocktime%1)*1e9)
  if (previousTimestamp) {
    seconds = seconds - previousTimestamp[0]
    nanoseconds = nanoseconds - previousTimestamp[1]
    if (nanoseconds<0) {
      seconds--
      nanoseconds += 1e9
    }
  }
  return [seconds,nanoseconds]
}

function clock(start) {
    if ( !start ) return hrtime();
    var end = hrtime(start);
    return Math.round((end[0]*1000) + (end[1]/1000000));
}

module.exports = clock;

用法非常简单: time = benchmark(); 启动计数器,time = benchmark(time); 测量自上次调用以来的持续时间。

这包括当我的应用程序需要在浏览器上运行时的 polyfill。

该功能似乎运行良好,但它严重(并且具有讽刺意味地)影响性能,尤其是(并且不出所料)在 Internet Explorer 中。

我怎样才能让它更快?

【问题讨论】:

    标签: javascript node.js performance profiling code-profiling


    【解决方案1】:

    你做了很多额外的计算......

    // polyfill for window.performance.now
    var performance = global.performance || {}
    var performanceNow =
      performance.now        ||
      performance.mozNow     ||
      performance.msNow      ||
      performance.oNow       ||
      performance.webkitNow  ||
      function(){ return (new Date()).getTime() }
    
    function clock(start) {
        if ( !start ) return performanceNow();
        var end = performanceNow();
        return end - start;
    }
    
    module.exports = clock;
    

    这段代码应该给出相同的结果。 (Math.round 省略)

    所有方法(performance.now 和 Date.getTime)都以毫秒为单位返回时间。 据我了解,这是预期的输出。

    现在在某些浏览器(Chrome)中的性能可以为您提供额外的亚毫秒时间段,然后返回值将是非整数

    例如

    > performance.now()
    160693.10000000405
    

    同时测试时间检索方法的性能:

    在 chrome 和我的电脑上 Date.now() 提供最大速度,将 performance.now() 输出提高三倍

    https://jsperf.com/get-time-3482/1

              Date.now    performance.now
    Chrome    10 MOps      3.5 MOps
    Safari    10 MOps      7   MOps
    

    如果您进行多次运行或测量较大的时间间隔,则可能不需要额外的纳秒精度

    然后你会得到 IE9+ 代码:

    var now = Date.now;
    function clock(start) {
        if ( !start ) return now();
        var end = now();
        return end - start;
    }
    
    module.exports = clock;
    

    =====

    补充说明:

    performance.now 与 Date.now 的性能在 Intel 与 AMD CPU 上可能而且应该有所不同

    他们使用不同的处理器指令来获取时间,请在此处查看一些详细信息,http://zeromq.org/results:more-precise-0mq-tests

    【讨论】:

    • 谢谢你...我会试试你发布的内容。抱歉没有早点回复 - 我们生了一个孩子,然后我休了陪产假......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2018-11-06
    • 2011-06-27
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多