【问题标题】:Is performance.now() in web workers reliable?网络工作者中的 performance.now() 可靠吗?
【发布时间】:2023-03-26 05:59:01
【问题描述】:

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

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() 测量的持续时间是不正确的。这是一种正确的假设吗?在这种情况下,衡量网络工作者持续时间的正确方法是什么?

谢谢!

【问题讨论】:

    标签: javascript multithreading asynchronous timing web-worker


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      听起来你在问,如果工人实际上没有在做某事,那么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() 来测量挂钟时间,包括工人何时在做事和何时不做事,似乎完全合理。

      【讨论】:

      • 我发现如果计算机完全进入睡眠状态,performance.now() 就会“暂停”。我想这是有道理的,因为它不受系统时钟的影响,而知道计算机睡眠时间的唯一方法是检查时钟。
      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 2019-02-01
      • 2016-02-21
      相关资源
      最近更新 更多