把计算挪到 Web Worker 后反而更慢了,可能是什么原因?
简答题中等1156 次浏览
参考答案与解析
Worker 能把计算从主线程挪走,但线程之间通信不是免费的。postMessage 传普通对象要做结构化克隆,发送端复制一遍、接收端再还原一遍;消息还要排队等对方线程空闲;结果回来还得再复制一次。如果搬运数据的成本接近甚至超过计算本身,或者消息又多又碎,整体延迟就会变长。所以要先测完整链路,再决定怎么传:大二进制用可转移对象,高频小消息合并批量发,队列要有上限。
速记要点
- postMessage 普通对象 = 结构化克隆,有复制成本
- ArrayBuffer 用 transfer 转移,不复制
- 小任务别分给 Worker,通信比计算还贵
- 高频消息合并成批,状态类消息只保留最新
- 队列设上限,支持取消
