Ruby 2:Forks / Threads,如何计算特定机器的效率?

时间:2013-09-29 14:16:30

标签: ruby multithreading

假设我的主板有4个CPU。 根据英特尔的说法,每个CPU都有8个内核/ 16个线程。

现在,假设我有一些疯狂的字符串操作任务需要几天才能完成。 有没有办法计算出多少叉子和螺纹会产生最佳性能? 我不确定我应该推出多少个叉子和线程。另外,我不确定启动线程是否会让我受益?

我对Ruby特别感兴趣,因为我不确定Ruby 2线程如何与例如C ++主题。

3 个答案:

答案 0 :(得分:1)

这取决于您正在使用的算法的细节。确实没有任何一般规则。

考虑如下任务:

  1. 驾驶卡车到A点。
  2. 等待装载机用小工具填满汽车。
  3. 将卡车驶向B点。
  4. 让卸载机清空卡车。
  5. 重复。
  6. 现在,假设此任务每小时移动1,000个小部件。如果添加第二辆卡车,您每小时会移动多少小部件?好吧,你当然可以推断它每小时不会超过2,000个小部件。

    为什么会少一些呢?那么,如果驾驶只花了一点点时间而且卡车花了很多时间等待装载机或卸载机与其他卡车一起完成怎么办?如果道路狭窄且卡车不能轻易绕过彼此怎么办?

    因此,为了了解,您必须了解算法使用的资源以及它如何使用它们。一般来说,很难预测唯一现实的选择是衡量。您可能会发现将算法更改为可以更好地并行化的算法。

答案 1 :(得分:1)

经验法则:每个CPU线程有1个进程或OS线程。

对于Ruby,至少是MRI Ruby,这转化为每个CPU线程1个分支,因为MRI Ruby线程不能真正并行执行。

答案 2 :(得分:1)

在MRI Ruby中,由于全局解释器锁定(GIL),在多个线程中运行CPU绑定进程几乎没有或没有好处,这实际上意味着任何时候只有一个用户级线程处于活动状态,每个Ruby进程。 JRuby没有这个限制。

在MRI Ruby中,您可以通过使用单独的流程(通过Process.fork)完成并行工作。在进程之间进行通信比在线程之间进行通信有更多的开销,但如果问题很简单并行,那么这不是什么大问题。

这可能是(MRI)Ruby和C ++之间的主要区别。但是,如果您有一个密集的代码进程,那么Ruby不是首选语言 - 至少不是您希望解决的核心问题。用C,C ++或Java编写大部分处理可能是优选的,使用Ruby可能用于编组输入和输出。这与线程模型无关,但是编写良好的C库可以比纯Ruby编写的同样快100倍,如果你在谈论一个过程需要花费一周的时间来处理Ruby的许多内核,那么投资用不同的语言会很好地回报(它可能只需要几个小时,或者你可以在同一时间或更少的时间内在不需要使用线程的情况下在单个核心上进行)

没有通用的公式可以确定最适合问题的线程或进程数。在能够最大限度地利用可用CPU之前,您可能会限制管理开销,使用的总内存等。你应该基准表现。显然,可用内核的数量是一个重要因素,可能一个好的猜测是从每个内核的1个线程(或进程)开始。