【发布时间】:2020-12-07 07:08:21
【问题描述】:
我在使用 windows 机器时遇到了一些奇怪的 node.js 问题,而这在 linux 机器上不会发生。
在低延迟设置(
//should be time in MS between executions
var delay = 10;
//how many seconds to run the test
var testPeriods = 10;
var counter = 0;
var startTime = new Date().getTime();
var interval = setInterval(() => {
++counter;
if (new Date().getTime() >= startTime+1000*testPeriods) {
console.log('Mean Function Calls per Second:', counter/testPeriods);
clearInterval(interval);
}
}, delay);
一些测试数据,来自我的双启动linux和windows的电脑:
Delay (ms) | Expected | Linux result | Windows result
-----------+----------+--------------+---------------
100 | 10 | 10.0 | 9.2
50 | 20 | 20.0 | 16.0
25 | 40 | 39.8 | 32.0
10 | 100 | 98.4 | 63.8
您会注意到,在较低的延迟设置之前,linux 结果几乎完美匹配,即使它们也相差不远。另一方面,windows 结果远远不够。
我认为与 linux 版本相比,node 的 windows 版本的优化可能很差。所以起初,我假设我提供的函数执行时间太长,从而延迟了下一次执行。然而,情况似乎并非如此。毕竟,如果我假设提供的函数无论如何都需要类似的时间来执行,那么我知道 Windows 机器可以在最低延迟设置下每秒最多执行约 63 次。那么为什么它在应该执行约 40 次(延迟 @ 25 毫秒)时只执行约 32 次?
如果有人能给我一些关于为什么会发生这种情况或我做错了什么的见解,那将不胜感激。
编辑:根据@jfriend00 的建议简化代码,并更新测试结果以匹配。
【问题讨论】:
-
你为什么要做快照?为什么不只检查您是否完成了总经过时间并仅使用您的计数器来计算总经过时间?仅供参考,当我简化并摆脱快照时,我仍然会得到类似的结果,但是代码要简单得多。
-
@jfriend00 是的,那样会更简单。我想我是这样做的,因为这个测试代码直接基于我用于项目的实际代码,需要像这样构造。
标签: javascript node.js linux windows setinterval