我应该使用process.nextTick还是setImmediate进行asynchronous迭代?

我正在研究一个JavaScript库 ,它提供了可以asynchronous迭代的序列上的map / reduce函数。

GitHub上的一个有用的灵魂build议,对于Node.js,我应该使用process.nextTick尽可能快地进行asynchronous迭代。 (图书馆目前在所有的环境中都使用setTimeout ,我也明白这是不理想的。)当谈到Node的时候,我相当缺乏经验,所以我正在阅读这个方法是如何工作的,而且我不清楚它是一个好的select与否。

根据对SO的另一个问题的回答 ,看起来在这种情况下使用setImmediate可能更有意义,因为nextTick显然跳过了悬而未决的I / O事件,这对我来说似乎很糟糕。

这似乎得到了官方Node v0.10.0宣言中的一些评论的佐证:

在v0.10中,每次从C ++调用JavaScript之后, nextTick处理程序都会运行。 这意味着,如果您的JavaScript代码调用process.nextTick ,那么只要代码运行完成,callback函数就会触发callback事件循环。

所以我是对的,迭代序列asynchronous应该用setImmediate ? 或者nextTick会是更好的select吗? (在这两种情况下,一个清楚的解释为什么将不胜感激。)

一些考虑:

我首先要做严重的基准testing,以确定setImmediate比process.nextTick要慢。 如果速度不是很慢,我会马上开始setImmediate ,因为这样不会导致事件循环setImmediate

在节点0.10有一个硬限制(1000,请参阅node.js文档 )多less次你可以recursion地调用nextTick,所以你应该防止在任何情况下发生。 您需要在迭代之前select策略,或者在迭代过程中能够更改策略(同时检查当前的迭代计数)。

如果出于性能原因selectprocess.nextTick,则可能需要设置一个可configuration的硬限制,以便连续执行process.nextTick次数,否则切换到setImmediate 。 我没有在nodejs上的严重工作负载的经验,但我认为人们不会喜欢它,如果你的图书馆使他们的I / O波涛汹涌。

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

至于浏览器:我没有研究过你的函数库,但是因为你实际上是来自setTimeout ,所以你可以通过window.postMessage帮助你学习到新的延迟技术。 有一个叫做next-tick的好的小型库(但是与节点next-tick不同,它的语义不同),并且有一个跨浏览器的setImmediate ,它比较重,因为1)需要实现setImmediate规范取消预定任务的能力)和2)它具有更宽的浏览器兼容性。

看看这个比较setImmediate(shim)到setTimeout的asynchronoussorting演示 。