为什么EventMachine比Node慢得多?

在我的具体情况下,至less。 不要在这里做一般的陈述。

我已经有了我在Node.js中编写的这个networking爬虫。 我很乐意使用Ruby,所以我把它重写在EventMachine中。 由于原来是在CoffeeScript,它实际上是惊人的容易,代码是非常相同的,除了在EventMachine我可以实际陷阱和exception恢复(因为我使用光纤)。

问题是Node.js代码在20秒内运行的testing在EventMachine上花费了5分钟甚至更多。 当我看到连接计数时,几乎看起来他们甚至没有平行运行(他们排队到数百,然后非常缓慢地下降),虽然日志显示代码点平行命中的。

我意识到,没有代码,你不能真正知道到底发生了什么,但我只是想知道是否有某种根本性的差异,我应该放弃,或者如果他们真的应该能够运行一样快小的放缓是好的),我应该继续尝试找出问题所在。

我做了以下,但它似乎没有任何影响:

puts "Running with ulimit: " + EM.set_descriptor_table_size(60000).to_s EM.set_effective_user('nobody') EM.kqueue 

哦,我非常肯定,在EventMachine中没有任何阻塞呼叫。 我已经梳理了大约10次寻找任何可能阻挡的东西。 我所有的networking电话都是EM :: HttpRequest。

问题是Node.js代码在20秒内运行的testing在EventMachine上花费了5分钟甚至更多。 当我看到连接计数时,几乎看起来他们甚至没有平行运行(他们排队到数百,然后非常缓慢地下降),虽然日志logging显示代码点是并行的。

如果它们没有并行运行,那么它不是asynchronous的。 所以你阻止了

基本上,你需要弄清楚在标准的Ruby库中,什么阻止了IO调用,并删除它,并用EventMachine非阻塞IO调用replace它。

您的代码可能没有任何阻止呼叫,但您是否使用不是您自己的或不是来自EM第三方代码? 他们可能会阻止。 甚至像debugging打印/日志这样简单的东西都可能阻塞。

我所有的networking电话都是EM :: HttpRequest。

怎么样的文件IO,那么TCP呢? 还有什么可以阻止的呢? 那么第三方库呢?

我们真的需要在这里看到一些代码。 要么在代码中识别瓶颈,要么阻塞呼叫。

node.js不应该比EM快一个数量级。