2013-04-11 65 views
3

我学习论坛中的红宝石,从Ruby编程语言书&发现被描述为每个迭代器的并发版本的方法,为什么在这种情况下并发循环比正常循环慢?

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声明,而最初的声明需要时间进行资源分配/初始化/终止线程?

回答

3

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

所以,你的代码连续运行,并且你有线程开销(创建/销毁线程等)。这就是为什么它更慢。

+0

这很有道理,谢谢澄清:) – 2013-04-11 15:16:54

相关问题