4つのXMLファイルのデータを4つの異なるデータ構造にロードするプログラムを作成しています。これは、このようなメソッドがあります。複数のスレッドを持つRubyのパフォーマンスと1つのスレッド
def loadFirst(year)
File.open("games_#{year}.xml",'r') do |f|
doc = REXML::Document.new f
...
end
end
def loadSecond(year)
File.open("teams_#{year}.xml",'r') do |f|
doc = REXML::Document.new f
...
end
end
etc...
私はもともとただ一つのスレッドを使用して、別の後に一つのファイルをロード:
def loadData(year)
time = Time.now
loadFirst(year)
loadSecond(year)
loadThird(year)
loadFourth(year)
puts Time.now - time
end
その後、私は、私は複数のスレッドを使用する必要があることに気づきました。私がいることがわかった何
def loadData(year)
time = Time.now
t1 = Thread.start{loadFirst(year)}
t2 = Thread.start{loadSecond(year)}
t3 = Thread.start{loadThird(year)}
loadFourth(year)
t1.join
t2.join
t3.join
puts Time.now - time
end
:私の期待は別のスレッド上の各ファイルからの読み込みが早くそれをすべて順番に(私はi7プロセッサー搭載するMacBook Proを持って)やって4倍に非常に近いだろうということでした実際には複数のスレッドを使用しているバージョンのほうが遅いです。これはどうやってできますか?違いは約20秒で、それぞれ約2〜3分かかります。
スレッド間に共有リソースはありません。それぞれ異なるデータファイルを開き、他のデータ構造とは異なるデータ構造にデータをロードします。
使用している言語のバージョンと使用しているVMはどちらですか?私は、ほとんどのRubyランタイムはまだ "緑色"のスレッドを使用していると信じています(実際にはマルチスレッドではなく、1つのスレッドでエミュレートされます) –
私は通常のRubyバージョン1.9.3を使用しています。私はちょっと調べて、ファイルの1つが他のものよりもはるかに多くのデータを持っていることを理解しました。そのため、パフォーマンスが4倍に変化しない理由を説明します。しかし、3つの他のものはまだ総体的に1分以上かかるので、私は複数のスレッドを使用して分の領域でパフォーマンスの向上を期待します... –
古典的なルビーはGILを持っています - あなたは一般的な1つのスレッドが一度に1つずつ実行されます(IOやその他の場合の例外を除きます)。 jrubyでコードを試してください –