ベンチマークとかではなくて。

私は訓練された技術者ではなくただの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はがんばらないと動かせません。こっちもどうにかしないと。