在Node.js/Bun中实现间隔<5ms的高分辨率setInterval的方法问询
在Node.js/Bun中实现间隔<5ms的高分辨率setInterval的方法问询
我正在开发一个需要与串口进行实时交互的应用,要求通信速率达到250Hz——这就需要我能实现间隔低于5ms的稳定定时器。
之前在浏览器环境里直接使用setInterval就能满足需求,但在Node.js和Bun里测试后,结果却差强人意,完全达不到我想要的精度。
我写了一段测试代码来对比不同环境下定时器的表现(注:修复了原代码中中位数计算的笔误):
function measure(setTimeout, time) { let i = 0, a = new Float64Array(10_000), p = Promise.withResolvers(); let start = performance.now(); let lastNow = start; function loop() { let now = performance.now(); a[i++] = now - lastNow; if (now - start > time) { p.resolve(a.slice(1, i-1).sort().reverse()) } else { lastNow = now; setTimeout(loop); } } loop(); return p.promise; } Promise.withResolvers ??= (o={})=>Object.assign(o,{promise:new Promise((r,j)=>{o.resolve=r;o.reject=j})}) measure(f => setTimeout(f, 1), 1000).then(a => console.log({ hz: a.length, max: a[0], '99%': a[~~(a.length*0.99)], '95%': a[~~(a.length*0.95)], '90%': a[~~(a.length*0.90)], median: a[~~(a.length/2)], // 修正原代码的笔误,计算中位数 a, }))
实际测试结果对比:
- 浏览器环境:
{hz:216,max:6.3,99%:6.1,95:5.9,90:5.2,median:4.6}—— 这个表现完全符合我的需求 - Node.js环境:
{hz:69,max:16.3,99%:16.1,95:16,90:16.2,median:15.45}—— 远达不到要求,我需要更好的精度 - Bun环境:
{hz:61,max:32.3,99%:32.1,95:17.8,90:16.2,median:15.45}—— 同样不符合预期
想请教各位开发者,在Node.js和Bun里有没有办法实现类似浏览器那样的高分辨率定时器,让间隔稳定在5ms以内?
备注:内容来源于stack exchange,提问作者Dimava
相关产品推荐
相关产品推荐

