私が最初にスレッドを発見したとき、通常どおり sleep を呼び出すのではなく、多くのスレッドで sleep を呼び出して、それらが実際に期待どおりに機能することを確認しようとしました。それはうまくいき、私はとても幸せでした。
しかし、私の友人は、これらのスレッドは実際には平行ではなく、睡眠がそれを偽造しているに違いないと私に言いました。
だから今、私は実際の処理を行うためにこのテストを書きました:
class Test
ITERATIONS = 1000
def run_threads
start = Time.now
t1 = Thread.new do
do_iterations
end
t2 = Thread.new do
do_iterations
end
t3 = Thread.new do
do_iterations
end
t4 = Thread.new do
do_iterations
end
t1.join
t2.join
t3.join
t4.join
puts Time.now - start
end
def run_normal
start = Time.now
do_iterations
do_iterations
do_iterations
do_iterations
puts Time.now - start
end
def do_iterations
1.upto ITERATIONS do |i|
999.downto(1).inject(:*) # 999!
end
end
end
run_threads() は run_normal よりもパフォーマンスが良くなかっただけでなく、さらに遅かったのです。
では、スレッドが実際には並列でないのに、なぜアプリケーションをスレッドで複雑にする必要があるのでしょうか?
** アップデート **
@fl00r は、スレッドを IO タスクに使用すればスレッドを利用できると言っていたので、さらに 2 つの do_iterations のバリエーションを作成しました。
def do_iterations
# filesystem IO
1.upto ITERATIONS do |i|
5.times do
# create file
content = "some content #{i}"
file_name = "#{Rails.root}/tmp/do-iterations-#{UUIDTools::UUID.timestamp_create.hexdigest}"
file = ::File.new file_name, 'w'
file.write content
file.close
# read and delete file
file = ::File.new file_name, 'r'
content = file.read
file.close
::File.delete file_name
end
end
end
def do_iterations
# MongoDB IO (through MongoID)
1.upto ITERATIONS do |i|
TestModel.create! :name => "some-name-#{i}"
end
TestModel.delete_all
end
パフォーマンス結果は同じです: 通常 > スレッド。
しかし、VM がすべてのコアを使用できるかどうかはわかりません。私がそれをテストしたときに戻ってきます。