javascript - 提高计时方法的性能
问题描述
我使用这个 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 中。
我怎样才能让它更快?
解决方案
你做了很多额外的计算......
// 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
推荐阅读
- javascript - 单击复选框后按钮未启用
- c - C中的自定义连接
- single-sign-on - 如何在 keycloak 中为 SAML 标识提供者(onelogin)设置映射器
- bubblewrap - 初始化气泡膜
- vb.net - 用反序列化版本替换对象,并保留引用
- c++ - 如何在 std::vectors 之间进行 std::copy
当 T 有 const memers 时? - syntax - 如何运行 reghdfe?我收到语法错误
- reactjs - 如何在另一个 index.js 文件上导出 react-slick?
- html - 不需要在控制台中显示但不在 vs 代码中的元素
- c# - 错误:使用 Vue.js 在 ASP.NET Core 中请求失败,状态码为 404