Dan*_*Tao 10 javascript performance node.js
我正在开发一个JavaScript库,它提供了可以异步迭代的序列上的map/reduce函数.
GitHub上一个有用的灵魂建议,对于Node.js,我应该process.nextTick尽可能快地进行异步迭代.(该库目前setTimeout在所有环境中都使用,我理解这是不是最理想的.)在Node方面我很缺乏经验,所以我正在阅读这种方法是如何工作的,我不清楚它是否是一个好的选择与否.
根据关于SO的另一个问题的答案,似乎setImmediate在这种情况下使用它可能更有意义,因为它nextTick显然超过了待处理的I/O事件,这对我来说似乎很糟糕.
官方Node v0.10.0公告中的一些评论似乎证实了这一点:
在v0.10中,
nextTick处理程序在每次从C++调用到JavaScript之后立即运行.这意味着,如果您的JavaScript代码调用process.nextTick,那么一旦代码运行完成,回调将立即触发,但在返回事件循环之前.
我是对的,应该异步迭代序列setImmediate吗?或者nextTick在这里会是更好的选择?(在任何一种情况下,一个明确的解释为什么会非常感激.)
Myr*_*tol 10
一些考虑:
我首先要对setImmediate的扩展速度进行严格的基准测试process.nextTick.如果它没有(太慢),我会立即去,setImmediate因为这不会使事件循环挨饿.
在节点0.10中有一个硬限制(1000,参见node.js文档)到你可以递归调用nextTick的次数,所以你应该防止在任何情况下发生这种情况.您需要在迭代之前选择策略,或者能够在迭代期间更改策略(同时检查当前迭代计数).
如果出于性能原因选择process.nextTick,则可能需要为process.nextTick连续执行的次数设置可配置的硬限制,否则切换到setImmediate.我没有在nodejs上有严重工作负担的经验,但我认为如果你的库使他们的I/O不稳定,人们就不会喜欢它了.
setImmediate肯定是最安全的,总而言之.
至于浏览器:我没有研究过您的图书馆,但由于您实际上是来自setTimeout,您可能会被帮助了解新的延迟技术,通过window.postMessage什么不是.有一个很好的小型库叫做next-tick(但是有不同的语义而不是节点next-tick!)并且有一个用于setImmediate的跨浏览器垫片,这是相当重的因为1)它需要实现setImmediate规范(包括取消预定任务的能力)和2)它具有更广泛的浏览器兼容性.
看看这个将setImmediate(shim)与setTimeout进行比较的异步排序演示.
| 归档时间: |
|
| 查看次数: |
2112 次 |
| 最近记录: |