You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:54:33