我应该使用process.nextTick或setImmediate进行异步迭代吗?

时间:2013-05-20 21:56:37

标签: javascript performance node.js

我正在研究a JavaScript library,除其他外,它提供了可以异步迭代的序列上的map / reduce函数。

helpful soul on GitHub建议对于Node.js,我应该使用process.nextTick尽可能快地进行异步迭代。 (该库目前在所有环境中都使用setTimeout,我理解这是不是最理想的。)在Node方面我很缺乏经验,所以我正在阅读这种方法是如何工作的并且不清楚我是否是一个好的选择。

根据the answer to another question on SO,似乎在这种情况下使用setImmediate可能更有意义,因为nextTick显然正在跳过提前待处理的I / O事件,对我来说似乎很糟糕。

the official Node v0.10.0 announcment中的一些评论似乎证实了这一点:

  

在v0.10中,每次从C ++调用后都会运行nextTick个处理程序   进入JavaScript。这意味着,如果您的JavaScript代码调用   process.nextTick,然后代码运行后将立即触发回调   完成,但之前回到事件循环。

我是对的,并且应该使用setImmediate异步迭代序列?或者nextTick会在这里成为更好的选择吗? (在任何一种情况下,一个明确的解释为什么将非常感激。)

1 个答案:

答案 0 :(得分:10)

一些注意事项:

我首先要对setImmediate的扩展速度比process.nextTick做更严格的基准测试。如果它(不是)慢得多,我会立即去setImmediate,因为这不会使事件循环挨饿。

在节点0.10中有一个硬限制(1000,参见node.js docs)你可以递归调用nextTick多少次,所以你应该防止在任何情况下发生这种情况。您需要在迭代之前选择策略,或者能够在迭代期间更改策略(同时检查当前迭代计数)。

如果出于性能原因选择process.nextTick,您可能需要设置一个可配置的硬限制,以确定连续执行process.nextTick的次数,然后切换到setImmediate。我没有在nodejs上有严重工作负担的经验,但我认为如果你的库使他们的I / O不稳定,人们就不会喜欢它了。

setImmediate肯定是最安全的,总而言之。

至于浏览器: 我没有研究过您的图书馆,但由于您实际上来自setTimeout,您可能会通过window.postMessage帮助您了解新的延迟技术。有一个很好的小库,名为next-tick(但语义不同于节点next-tick!)并且有一个cross-browser shim for setImmediate,这是一个相当重的因为1)它需要实现setImmediate规范(包括取消预定任务的能力)和2)它具有更广泛的浏览器兼容性。

查看此async sorting demo比较setImmediate(shim)与setTimeout。