web.now()在web worker中是否可靠?

时间:2015-04-17 13:14:04

标签: javascript multithreading asynchronous timing web-worker

我有一个由专门的网络工作者执行的这个长时间运行的脚本,我想知道在现实世界中执行需要多长时间。

time1 = performance.now();   
doSomethingSyncronous();
time2 = performance.now();
doSomethingAsyncronous(function() {
   time3 = performance.now();
}
doSomethingSyncrounous();
time4 = performance.now();

在这个例子中,我希望time2-time1成为doSomethingSyncronous()的实际持续时间,就像我希望time3-time2成为doSomethingAsyncrounous的实际持续时间一样。

我想工作线程可以在CPU想要的时候休眠,而使用performance.now()测量的持续时间也是不正确的。这是一种正确的假设吗?在这种情况下,测量网络工作者持续时间的正确方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

  

我想工作线程可以在CPU想要的时候休眠,而使用performance.now()测量的持续时间也是不正确的。这是一种正确的假设吗?

部分。是的,操作系统可以让线程随时睡眠。当有更重要的工作要做,或者它决定限制CPU以节省电力时(例如在移动设备上),这样做。

但不,这不会使持续时间测量不正确。它只是意味着您的代码在特定环境中运行速度较慢。

答案 1 :(得分:1)

听起来你问的是,如果工人实际上没有做某事,那么performance.now()衡量的时间会增加吗?来自https://developer.mozilla.org/en-US/docs/Web/API/Performance/now

  

Performance.now()返回的值总是以恒定速率增加,与系统时钟无关(可能会手动调整或被NTP等软件扭曲)

[强调我的]

所以它强烈建议时间一直在增加,而不仅仅是工人做事时。

作为测试,您可以看到http://plnkr.co/edit/alMahs56ACjzH10FUmus?p=preview工作人员仅使用performance.now()回复邮件:

self.onmessage = function() {
  self.postMessage(self.performance.now());
}

如果以约1秒的间隔调用,则每次上升时间约为1秒,而实际计算工作线程的时间 更少。

因此,使用performance.now()来衡量挂钟时间,包括工作人员做事情的时间和不工作时间,这似乎是完全合理的。