2

The Ruby Programming Language bookから 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実装が間違っているか、最初の実装ではリソースの割り当て/初期化/スレッドの終了に時間がかかったのに、2番目の実装にはステートメントしかありませんか?

4

1 に答える 1

3

MRI (「ゴールド スタンダード」ルビー) のスレッドは、実際には同時実行ではありません。スレッドが同時に実行されるのを防ぐ Global VM Lock (GVL) があります。ただし、現在のスレッドが I/O でブロックされているときに他のスレッドを実行できますが、そうではありません。

したがって、コードはシリアルに実行され、スレッドのオーバーヘッド (スレッドの作成/破棄など) があります。それが遅い理由です。

于 2013-04-11T13:57:15.460 に答える