ベンチマークとかではなくて。
私は訓練された技術者ではなくただのhobbyistいです。なんとなく比べてみただけで、比べる意味とか難しい話はわかっていません。
ruby-devにこんなメール[ruby-core:14965]が流れていました。
counts = [ 0 ] * 10 Thread.abort_on_exception = true 10.times do |i| thread = Thread.new(i) do |index| Thread.current.priority = index loop do counts[index] += 1 Thread.pass end end end sleep 1 p counts
このスレッドの趣旨は多分1.9ではpriorityが期待したように動かないよ。ってことで、対応できないならこれ削るべきじゃないとかそんな感じです。
よくわからんのですが、これ1.8で返事がありません。ri Thread.priority したら、'zero for the initial main thread;'って書いてあったのと負の値でもよさそうだったので、以下のように書き換えたら動きました。まぁ、これが期待されている動きなのかはわかりませんが。あとなんとなく総合計も加えてみました。
counts = [ 0 ] * 10 Thread.abort_on_exception = true 10.times do |i| thread = Thread.new(i) do |index| Thread.current.priority -= index loop do counts[index] += 1 Thread.pass end end end sleep 1 p counts p counts.inject{|s,i| s+=i}
indexを引くようにしたのと、最後の行を加えただけです。ほかに、10.timesの前にThread.current.priority = 11とかでも動きました。
ちなみにデーブさんのマシンでの出力は
I get [6176, 6173, 6167, 6173, 6174, 6175, 6177, 6178, 6174, 6177] ruby 1.9.0 (2008-01-10 revision 0) [i686-darwin9.1.0]
だったそうです。合計すると61744ですね。
一秒でこんなに回るんだ。と思って、んじゃ、俺んところではどうよ。ってのがこのエントリの動機です。
で、われらがAIX(Power5 2GHz ×1)で、まずは1.8から
% ruby -v test.rb ruby 1.8.6 (2008-01-11 patchlevel 5000) [powerpc-aix5.3.0.0] [158811, 0, 0, 0, 0, 0, 0, 0, 0, 0] 158811
で、1.9だと
% ruby -v test.rb ruby 1.9.0 (2008-01-13 revision 0) [powerpc-aix5.3.0.0] [24021, 24348, 25503, 25955, 24304, 25035, 26699, 24954, 24871, 29959] 255649
ちなみに、結構ばらつきがあり、10回ぐらいやってその中間値ぐらいのデータです。1.8だとpriorityが高いのだけ実行されます(高いThreadから作られるからか)が、1.9だと散らばります。おそらくこれがこのメールで言っていた話だと思います(多分)。相手のスペックはわかりませんが、さすがサーバーマシン、1.9でデーブさんの4倍ぐらいのスコア(?)です。
ためしに隣にあったマシン(Xeon 3.0GHz)ですと、
ruby 1.9.0 (2008-01-13 revision 0) [x86_64-linux] [31763, 32325, 32976, 32889, 33006, 32163, 32806, 32728, 32737, 32620] 326013
でした。高いほうのサーバが負けました。
ここからが本題です。AIXにはいろいろTuningパラメータがあります。いや、もちろんLinuxにもあるんでしょうが、よく知らないので、ここはAIXでの話。今回(?)はAIXTHREAD_SCOPEです。
% AIXTHREAD_SCOPE=S ruby -v test.rb ruby 1.9.0 (2008-01-13 revision 0) [powerpc-aix5.3.0.0] [3876, 599, 83732, 73825, 84535, 41145, 41789, 43374, 38360, 58508] 469743
なぜかすっごいばらつきましたが、Total処理数は増えました。うーん。かたよったことで切り替えが少なくなってその分Totalが増えたとかですかねぇ。
そこで、上のスクリプトのpriorityの行を消して再実行してみたところ、
ruby 1.9.0 (2008-01-13 revision 0) [x86_64-linux] [32957, 33184, 32961, 33127, 33522, 33036, 33822, 32288, 33506, 33457] 331860 ruby 1.9.0 (2008-01-13 revision 0) [powerpc-aix5.3.0.0] [37224, 37866, 40339, 41940, 46476, 36807, 54048, 41805, 46034, 36984] 419523
AIXではかたよりが減って、Total数が減ったものの、AIXTHREAD_SCOPEなしの6割増ぐらい出せました。
で、リース切れ寸前のPowerPC 604e 375MHzでやってみると、
$ AIXTHREAD_SCOPE=S ruby -v test.rb ruby 1.9.0 (2008-01-13 revision 0) [powerpc-aix4.3.3.0] [9794, 12289, 7490, 9280, 11086, 5725, 16075, 10333, 7074, 7394] 96540
デーブさんはもうちょっといいマシン使ってもいいんじゃないかと。
去年かったノートパソコンの、Core Duo 2(T7200)だと、
% ruby -v test.rb ruby 1.9.0 (2008-01-13 revision 0) [x86_64-linux] [92762, 92716, 88731, 88610, 90065, 92166, 90743, 93543, 93297, 94944] 917577
やるじゃないか。AIXはLPARほどいてCPU2個の状態にして今度やってみようかな。
で、AIX上では今のところ1.9はがんばらないと動かせません。こっちもどうにかしないと。