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

相關問題