在这种情况下,为什么并发循环比正常循环慢?

时间:2013-04-11 13:53:17

标签: ruby

我正在学习Ruby中的Threads,来自 The Ruby Programming Language book&发现这个方法被描述为每个迭代器的并发版本,

module Enumerable
  def concurrently
    map {|item| Thread.new { yield item }}.each {|t| t.join }
  end
end

以下代码

 start=Time.now
 arr.concurrently{ |n| puts n} # Ran using threads
 puts "Time Taken #{Time.now-start}"

输出:Time Taken 6.6278332

虽然

start=Time.now
arr.each{ |n| puts n} # Normal each loop
puts "Time Taken #{Time.now-start}"

输出:Time Taken 0.132975928

为什么没有线程会更快?实现是错误的还是第二个只有puts语句,而最初的一个花费时间进行资源分配/初始化/终止线程?

1 个答案:

答案 0 :(得分:3)

MRI中的线程(“黄金标准”红宝石)并不是真正的并发。有一个全局VM锁(GVL)可以防止线程同时运行。但是,它允许在当前线程在I / O上被阻塞时运行其他线程,但这不是你的情况。

因此,您的代码以串行方式运行,并且您具有线程开销(创建/销毁线程等)。这就是它变慢的原因。