优化定时器的核心是任务源头减法:合并同类定时任务、改用事件驱动、分级延迟执行、清理非必要定时器。

减少定时器引发的系统调用频繁,核心不是“调高 timer_resolution”或“改内核参数”,而是从任务源头做减法——让真正需要执行的定时任务变少、变合理。
合并同类定时任务
多个功能相近的定时器(比如检查状态、刷新缓存、上报心跳)往往可以统一由一个定时器驱动,内部用时间戳或标志位判断是否该执行某项逻辑。
- 例如:原有两个定时器,分别每 30ms 检查窗口焦点、每 50ms 更新输入法状态,可合并为一个 100ms 定时器,在回调中按需分发处理
- Node.js 中避免多个
setInterval(fn, 10),改用单个setInterval+ 队列调度 - PHP 脚本中,把多个 cron 条目(如每分钟清理日志、每分钟检测磁盘、每分钟同步配置)合并为一个脚本,通过参数区分动作
替换高频轮询为事件驱动
很多定时器本质是“被动等待变化”,而系统本身已提供更高效的事件通知机制。
- Windows 下用
WinEventHook替代SetTimer检测窗口激活,避免每 25ms 主动轮询 - Linux 下用 inotify 监控文件变更,替代定时
stat()检查配置文件是否修改 - Web 场景中,用 Server-Sent Events 或 WebSocket 心跳保活,替代前端 setInterval 拉取状态
分级延迟与按需唤醒
非关键路径的定时逻辑不必严格准时,可采用“空闲时执行”或“下次活跃时补做”的策略。
- 在 Node.js 中,用
queueMicrotask或process.nextTick替代短间隔setTimeout,避免强制进入下一轮事件循环 - 后台服务中,将日志压缩、临时文件清理等低优先级任务设为“仅当 CPU 空闲 ≥ 5 秒时触发”
- GUI 应用中,托盘图标状态更新可在用户鼠标悬停时才触发,而非持续轮询进程信息
清理和禁用非必要定时器
第三方 SDK、监控埋点、调试工具常自带默认定时器,容易被忽略但实际开销不小。
- 检查
node_modules中的 SDK(如 Sentry、Datadog、自定义重试库),关闭其默认心跳或降频至 30s+ - 开发环境启用的调试定时器(如 React DevTools 的状态监听)务必在生产构建中移除
- 定期审计 cron 日志:
grep "CMD" /var/log/cron | awk '{print $9}' | sort | uniq -c | sort -nr,识别高频重复任务











