在Node.js中多次调用计算成本高昂的函数的最快方法



我有一个函数在计算上有些昂贵,我们在这里谈论的是2-5毫秒。

function heavyWork() {
// ...
}

heavyWork()一次被我代码的不同部分调用了好几次,阻塞了Node.js的事件循环。我曾考虑使用child_process.fork将其移动到子进程,然而,即使只是发送约500条IPC消息,也需要与在主进程中计算它相同的时间。理论上,我可以接受这个解决方案,它只是比以前慢了一点,并且不会阻塞事件循环,尽管我想加快速度。

我尝试的另一件事是使用Worker Threads。然而,生成这么多线程显然比以前的方法还要慢。

在将消息发送到工作进程之前,我可能必须找到一种方法来批处理消息,除非有一种方法可以在Node中实现,但我还没有尝试过。有什么想法吗?

我不知道有什么解决方案。我认为创建批量是你最好的选择。

我会考虑的一些事情:

  • 是否可以缓存结果
  • 使用setInterval可以确保在调度之前不会等待批次填满
  • 创建一个partioner函数,负责评估工作应该如何分配。例如,如果当前批处理很小,那么只在主线程上运行它。partioner可以查看不同核心的负载,然后相应地分配负载。此外,如果我只有1个核心和2个线程,那么批量大小应该小于我有4个核心和8个线程的情况
  • 为了帮助我的参与者,我还可以围绕我的heavyWork函数创建一个包装器,表示1-5范围内的预期工作负载,其中5是非常占用CPU的工作
  • 根据经验,我不会产生超过核心数量2倍的工作线程。这降低了交换的风险

(我对partioner函数的想法是从微软那里借来的(

最新更新