提高计时方法的效果

时间:2018-04-25 10:56:43

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

我使用此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中。

如何更快地完成?

1 个答案:

答案 0 :(得分:2)

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

await

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

所有方法(performance.now&amp; Date.getTime)以毫秒为单位返回时间。 据我所知,这是预期的产出。

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

e.g。

onSubmit

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

在Chrome和我的计算机上,Date.now()给出了最高速度,三倍的性能输出。现在()

请参阅https://jsperf.com/get-time-3482/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;

如果您进行多次运行或者您测量的时间间隔很长,则可能不需要额外的纳秒预备

然后你将得到IE9 +代码:

> performance.now()
160693.10000000405

=====

附加说明:

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

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