これに続いて、 Rubyスレッドの制限 - また、どの言語でも
スレッドが機能しない理由を理解しようとしています。いくつかの答えは次のように非常に明確でした:
「.. fork を使用して 4 つのサブプロセスを作成すると、4 つのコアが使用されます」これは、私の場合はスレッドが機能しないように見えるため、これが最終的なアプローチになります。
これも:
「..Ruby MRI スレッド化だけでは、Ruby コードを実行するマルチコア CPU を完全に利用することはできません。しかし、それが問題になるかどうかは、スレッドが何を行っているかによって異なります。他の同じマシン上で複数のプロセスを実行することで、別のプロセスを必要とせずにメリットが得られます. サブジェクトとしてのスレッド化とマルチプロセッシングは、単純なことを実行するだけでも非常に複雑になる可能性があります. ほとんどの言語は、最初から簡単なことと難しいことについてある程度の妥協をします. ...」
2 つ目の問題を考慮して、コードからすべての処理を削除し、I/O だけを残しました。
ここにあります:
beginning_time = Time.now
img_processor.load_image(frames_dir+"/frame_0001.png")
img_processor.load_image(frames_dir+"/frame_0002.png")
end_time = Time.now
puts "Time elapsed #{(end_time - beginning_time)*1000} milliseconds"
beginning_time = Time.now
for frame_index in 1..2
greyscale_frames_threads << Thread.new(frame_index) { |frame_number|
puts "Loading Image #{frame_number}"
img_processor.load_image(frames_dir+"/frame_%04d.png"%+frame_number)
}
end
puts "Joining Threads"
greyscale_frames_threads.each { |thread| thread.join } #this blocks the main thread
end_time = Time.now
puts "Time elapsed #{(end_time - beginning_time)*1000} milliseconds"
そして、私が得ているのはこれです...
最初のスレッド化されていないケースの場合:
経過時間 15561.358 ミリ秒
2 番目のスレッドの場合:
経過時間 15442.401 ミリ秒
わかりました、パフォーマンスの向上はどこにありますか? 何か不足していますか?HDDがブロックしていませんか?Ruby で実際の並列処理を確認するには、本当にプロセスを生成する必要がありますか?