JavaScript中的微秒计时
JavaScript中是否有微秒分辨率的计时函数 我知道Chrome的解决方案,并希望能为其他友好浏览器提供解决方案,如Firefox、Safari、Opera、Epiphany、Konqueror等。我对支持任何IE都不感兴趣,但欢迎提供包括IE在内的答案 (考虑到JS中毫秒计时的准确性很差,我不会屏住呼吸的!) 更新:timer.js宣传微秒分辨率,但它只是将毫秒读数乘以1000。通过测试和代码检查进行验证。失望的[一般来说,答案是“不”。如果您在某些服务器端环境(即,不是在浏览器中)中使用JavaScript,那么所有赌注都是无效的,您可以尝试做任何您想做的事情JavaScript中的微秒计时,javascript,Javascript,JavaScript中是否有微秒分辨率的计时函数 我知道Chrome的解决方案,并希望能为其他友好浏览器提供解决方案,如Firefox、Safari、Opera、Epiphany、Konqueror等。我对支持任何IE都不感兴趣,但欢迎提供包括IE在内的答案 (考虑到JS中毫秒计时的准确性很差,我不会屏住呼吸的!) 更新:timer.js宣传微秒分辨率,但它只是将毫秒读数乘以1000。通过测试和代码检查进行验证。失望的[一般来说,答案是“不”。如果您在某些服务器端环境(即,不是在浏览器中)中使用
编辑-这个答案很古老;标准已经进步,新的工具可以作为精确时间问题的解决方案。尽管如此,应该记住,在真正的实时操作系统领域之外,普通非特权代码对其访问计算资源的控制有限。衡量性能是非常重要的与预测性能不同(必然如此)。现在有一种新的测量javascript中微秒的方法: 然而,在过去,我发现了一种粗糙的方法,可以用毫秒计时器在JavaScript中获得0.1毫秒的精度。不可能?不可能。继续阅读: 我正在做一些高精度的实验,需要自检定时器的精度,发现在某些系统的某些浏览器上,我能够可靠地获得0.1毫秒的精度 我发现,在现代GPU加速的快速系统上的web浏览器中(例如i7四核,其中有几个核是空闲的,只有浏览器窗口)--我现在可以相信计时器是毫秒级的。事实上,它在空闲的i7系统上变得如此精确,我已经能够可靠地获得完全相同的毫秒,超过1000次尝试。只有当我尝试加载额外的网页或其他事情时,毫秒级的精确度才会降低(我能够通过做前后时间检查成功地捕捉到自己的精度下降,看看我的处理时间是否突然延长到1毫秒或更多毫秒——这有助于我使可能受到CPU波动太不利影响的结果无效) 它在i7四核系统上的一些GPU加速浏览器中变得如此精确(当浏览器窗口是唯一的窗口时),我发现我希望能够访问JavaScript中的0.1ms精度计时器,因为现在某些高端浏览系统上的精度终于达到了,这样的计时器精度对于需要高精度的特定类型的小应用程序来说是值得的,并且应用程序能够自我验证精度偏差 显然,如果要进行多次传递,只需运行多次传递(例如10次传递),然后除以10即可获得0.1毫秒的精度。这是获得更高精度的常用方法——进行多次传递并将总时间除以传递数 然而,如果由于异常独特的情况,我只能通过一次特定测试的基准测试,我发现通过这样做,我可以获得0.1(有时是0.01ms)的精度: 初始化/校准:
function startTimer() {
const time = process.hrtime();
return time;
}
function endTimer(time) {
function roundTo(decimalPlaces, numberToRound) {
return +(Math.round(numberToRound + `e+${decimalPlaces}`) + `e-${decimalPlaces}`);
}
const diff = process.hrtime(time);
const NS_PER_SEC = 1e9;
const result = (diff[0] * NS_PER_SEC + diff[1]); // Result in Nanoseconds
const elapsed = result * 0.0000010;
return roundTo(6, elapsed); // Result in milliseconds
}
const start = startTimer();
console.log('test');
console.log(`Time since start: ${endTimer(start)} ms`);
console.time('Time since start');
console.log('test');
console.timeEnd('Time since start');
const num = 10;
console.time(`Time til ${num}`);
for (let i = 0; i < num; i++) {
console.log('test');
if ((i+1) === num) { console.timeEnd(`Time til ${num}`); }
console.log('...additional steps');
}