gpt4 book ai didi

javascript - JavaScript 中的 timeout 和 interval 是否使用单调时间?

转载 作者:行者123 更新时间:2023-12-04 08:40:53 24 4
gpt4 key购买 nike

假设我调用 setTimeout(() => {...}, 1000) ,即等待 1 秒,但计算机的内部时钟错误。 500ms 后,OS 收到 NTP 更新,意识到其时钟在 future 30 秒,因此将其时钟倒退 30 秒。我的超时何时会触发? 500ms,单调时间;或 30500 毫秒,挂钟时间?
如果它在 30 秒内......有没有办法设置一个计时器,它会在 500 毫秒后正确触发,如 performance.now() 所测量的那样?
浏览器之间的行为是否有所不同?

注意:当然,您永远不会获得高度准确的 setTimeout,因为浏览器会减轻 Spectre 的影响,而旧代码依赖于最小延迟,但我的问题是由于内部时钟的变化导致时间的巨大跳跃。

最佳答案

通过在不同浏览器中运行以下代码段并查看在不同操作系统中更改操作系统时钟时间时的行为。
不同的测试:
测试 1:

  • 运行代码片段
  • 设置 future 时间(30秒内)
  • 检查结果

  • 测试 2:
  • 运行代码片段
  • 设置过去时间(30秒内)
  • 检查结果

  • 测试 3:
  • 运行代码片段
  • 设置过去时间(30秒内)
  • 设置 future 时间(30秒内)
  • 检查结果

  • 测试 4:
  • 运行代码片段
  • 设置 future 时间(30秒内)
  • 设置过去时间(30秒内)
  • 检查结果

  • 我运行的每个测试都重复了 5 次。

    const perfor = () => {
    console.log(performance.now());

    window.requestAnimationFrame(perfor);
    }

    window.requestAnimationFrame(perfor);

    setTimeout(() => {
    alert('HI');
    }, 30000);

    在 Windows 10(操作系统版本 19041.508)上测试,所有浏览器都是 64 位版本:
    测试 1:
                                  | setTimeout           | perfor     |
    ------------------------------|----------------------|------------|
    Firefox 81.0.2 | fired after ~30 secs | kept going |
    Firefox 82.0.1 | fired after ~30 secs | kept going |
    Google Chrome 86.0.4240.111 | fired after ~30 secs | kept going |
    Microsoft Edge 44.19041.423.0 | fired after ~30 secs | kept going |
    测试 2:
                                  | setTimeout           | perfor                      |
    ------------------------------|----------------------|-----------------------------|
    Firefox 81.0.2 | fired after ~30 secs | stopped when time rewinded* |
    Firefox 82.0.1 | fired after ~30 secs | kept going |
    Google Chrome 86.0.4240.111 | fired after ~30 secs | kept going |
    Microsoft Edge 44.19041.423.0 | fired after ~30 secs | kept going |
    测试 3:
                                  | setTimeout           | perfor                      |
    ------------------------------|----------------------|-----------------------------|
    Firefox 81.0.2 | fired after ~30 secs | stopped when time rewinded* |
    Firefox 82.0.1 | fired after ~30 secs | kept going |
    Google Chrome 86.0.4240.111 | fired after ~30 secs | kept going |
    Microsoft Edge 44.19041.423.0 | fired after ~30 secs | kept going |
    测试 4:
                                  | setTimeout           | perfor                      |
    ------------------------------|----------------------|-----------------------------|
    Firefox 81.0.2 | fired after ~30 secs | stopped when time rewinded* |
    Firefox 82.0.1 | fired after ~30 secs | kept going |
    Google Chrome 86.0.4240.111 | fired after ~30 secs | kept going |
    Microsoft Edge 44.19041.423.0 | fired after ~30 secs | kept going |
    * 在 Firefox 81.0.2 中记录 performance.now()当我将操作系统时间设置为过去时停止。因此,如果我在 future 设置我的年、月或日,然后为我将来设置我的年、月或日,但对于现在过去的机器,Firefox 81.0.2 将停止记录 performance.now() .我找不到为什么会发生这种情况以及为什么会在 82.0.1 中修复它的原因。
    注意:我可以在多个版本中测试 Firefox,因为我有更新。
    我邀请其他用户运行这些并编辑以添加结果 performance.now()将显示自选项卡打开以来的毫秒数。这在 Windows 10 中不会通过更改操作系统时钟时间来实现。

    关于javascript - JavaScript 中的 timeout 和 interval 是否使用单调时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64573202/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com