哈希红宝石散列中的多线程

时间:2010-08-31 17:04:10

标签: ruby

我有一个像这样的代码片段

 myhash.each_value{|subhash|
  (subhash['key]'.each {|subsubhash|

     statement that modifies the subsubhash and takes about 0.07 s to execute
     })
  }

这个循环运行100次以上,不用说我的应用程序速度极慢(运行此循环大约需要7秒)。

有关如何加快速度的任何指示?我无法控制真正昂贵的陈述。有没有办法在循环中使用多线程,这样语句可以并行执行?

2 个答案:

答案 0 :(得分:0)

您可以在单独的线程中运行每个子哈希处理循环,但是否这会导致性能提升可能取决于(1)您正在使用的Ruby解释器或(2)最内层块是否受IO限制或计算结合。

#1的原因是某些Ruby解释器(例如CRuby / MRI 1.8)使用green threads,即使在多核计算机上也不会受益于任何实际的并行处理。但是,YARV和JRuby都使用本机操作系统线程(JRuby甚至是1.8,因为JVM使用本机线程),因此如果您可以专门针对这些解释器,那么您可能会看到改进。

#2的原因是如果最里面的块是IO绑定的,那么即使是基于绿色线程的解释器也可能提高性能,因为大多数操作系统都能很好地调度线程来阻止IO调用。如果该块是严格计算绑定的,则只有基于本机线程的解释器可能会使用多个线程显示性能提升。

答案 1 :(得分:0)

threads = []
myhash.each_value{ |subhash|
  threads << Thread.start do
    subhash['key'].each { |subsubhash|
     threads << Thread.start do
       statement that modifies the subsubhash and takes about 0.07 s to execute
     end
    }
  end
}
threads.each { |t| t.join }

请注意,MRI 1.8.x不使用真正的线程,而是使用与实际OS线程不对应的绿色线程。但是,如果你使用JRuby,你可能会看到性能提升,因为它支持真正的线程。