【问题标题】:Why setInterval runs slower than expected? [duplicate]为什么 setInterval 运行速度比预期慢? [复制]
【发布时间】:2018-03-09 20:51:52
【问题描述】:

我希望下面的代码 setIntervalsetTimeout 之前运行 100 次。

var current = 0;

var timer = setInterval(function(){
    process.stdout.write(current.toString() + '\n');

    if(current === 1000) {
        clearInterval(timer);
        process.stdout.write('Done');   
    }

    current += 10;
}, 10);

setTimeout(function(){
    process.stdout.write('This is 1000.\n');
}, 1000);

但它的结果:

860
870
880
This is 1000.
890
900
910
920
930
940
950
960
970
980
990
1000
Done

我对@9​​87654325@ 有什么不明白的地方?我认为最后一个setIntervalsetTimeout 应该在最后一起运行。

【问题讨论】:

  • setInterval 可能会尽力在您设置的时间执行,但由于您在间隔内运行代码,因此不能保证它会每 10 毫秒执行一次,因为它也需要一些小的时间运行代码的时间。 JS 不是实时语言。您可以预期脚本执行时间会有所不同,具体取决于硬件/浏览器和您机器上的当前负载
  • 所有的答案和重复的问题都不回答这个问题! nodejs 的队列应该比 10ms 快得多,并且 nodejs 从来没有说它会把间隔提高到 10ms(浏览器明确声明是 4ms 或 IIRC)

标签: node.js


【解决方案1】:

所有调度的代码都放在一个队列中并由一个线程处理。如果setInterval 函数的完成速度不能超过 10 毫秒,则执行时间将落后于计划。无法保证准确的执行时间。

【讨论】:

    【解决方案2】:

    setInveralsetTimeout 没有执行/调度保证,并且下降到多达 10 毫秒的间隔几乎总是会失败。在浏览器上可预测的时间间隔内您可能获得的最佳值是requestAnimationFrame。这通常与屏幕的刷新率相匹配,因此 60Hz 的间隔通常为 16.66 毫秒。请记住,这仍然会丢帧,并且如果标签不在焦点上,它可能会暂停。

    【讨论】:

    • node.js中没有这样的链接requestAnimationFrame
    【解决方案3】:

    可能是因为 process.stdout.write 是一个消耗性 I/O 操作比 10ms 花费更多。

    setInterval() 正在等待函数完成后再启动另一个函数。

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      相关资源
      最近更新 更多