メッセージ格納先別の性能比較

だいぶ種類も増えてきたので、ちょっと比較してみます。


ベンチマークプログラムは前回同様なので、リソースは全然使いきれてません。
並列度は 1 なので、あくまで TAT の積み上げですね... (^^;


メッセージの put/get を 1000 回 (合計 2000 処理) 実行し、時間を計測します (それを 10 回ずつ実行しています)。
ベンチマークAP4R、DB プロセスはすべて同一筐体 (iMac) 上でした。

  • Memory

さすがに一番速いです。

% irb -rubygems -rap4r
>> q = ReliableMsg::Queue.new "test"
>> Benchmark.bm do |b|
?>   10.times do
?>     b.report do
?>       1000.times do
?>         q.put "hoge"
>>         q.get
>>       end
>>     end
>>   end
>> end
      user     system      total        real
  0.350000   0.060000   0.410000 (  1.627003)
  0.400000   0.060000   0.460000 (  1.546941)
  0.360000   0.050000   0.410000 (  1.602893)
  0.400000   0.060000   0.460000 (  1.541918)
  0.360000   0.060000   0.420000 (  1.559262)
  0.390000   0.050000   0.440000 (  1.541137)
  0.360000   0.060000   0.420000 (  1.592289)
  0.400000   0.060000   0.460000 (  1.585100)
  0.350000   0.050000   0.400000 (  1.551247)
  0.410000   0.060000   0.470000 (  1.679758)
=> true
  • Disk (ファイル)

かなり健闘。
「Too many open files ...」さえでなきゃ、十分使えます。

      user     system      total        real     
  0.360000   0.060000   0.420000 (  1.960346)
  0.410000   0.060000   0.470000 (  2.102785)
  0.380000   0.060000   0.440000 (  2.089084)
  0.400000   0.060000   0.460000 (  1.850098)
  0.360000   0.050000   0.410000 (  1.964865)
  0.420000   0.060000   0.480000 (  2.026365)
  0.360000   0.060000   0.420000 (  1.874406)
  0.360000   0.060000   0.420000 (  1.960062)
  0.420000   0.060000   0.480000 (  1.954411)
  0.350000   0.050000   0.400000 (  1.777127)
=> true

MySQL/Ruby だったか Ruby/MySQL だったか...?
あとで調べる。

      user     system      total        real
  0.490000   0.080000   0.570000 (  5.359927)
  0.540000   0.070000   0.610000 (  5.325624)
  0.480000   0.070000   0.550000 (  5.392035)
  0.530000   0.070000   0.600000 (  7.181195)
  0.490000   0.070000   0.560000 (  5.302066)
  0.540000   0.080000   0.620000 (  5.103011)
  0.490000   0.070000   0.560000 (  5.400249)
  0.540000   0.070000   0.610000 (  5.371737)
  0.480000   0.070000   0.550000 (  5.327426)
  0.540000   0.070000   0.610000 (  5.962652)
=> true

従来版よりも多少遅くなりました。

      user     system      total        real
  0.480000   0.070000   0.550000 (  7.137181)
  0.530000   0.070000   0.600000 (  7.207809)
  0.490000   0.070000   0.560000 (  7.188447)
  0.530000   0.070000   0.600000 (  6.737419)
  0.480000   0.070000   0.550000 (  7.628664)
  0.520000   0.070000   0.590000 (  8.511229)
  0.490000   0.070000   0.560000 (  6.822549)
  0.530000   0.070000   0.600000 (  7.532937)
  0.480000   0.070000   0.550000 (  6.301971)
  0.530000   0.070000   0.600000 (  6.433761)
=> true

Postgres(Ruby PostgreSQL 拡張モジュール) を利用しました。
MySQL より遅かったです。

      user     system      total        real
  0.530000   0.070000   0.600000 (  7.479290)
  0.480000   0.070000   0.550000 (  9.918172)
  0.520000   0.070000   0.590000 (  7.721443)
  0.470000   0.070000   0.540000 (  8.294701)
  0.480000   0.070000   0.550000 (  7.096044)
  0.510000   0.070000   0.580000 (  7.355886)
  0.480000   0.070000   0.550000 (  9.278422)
  0.520000   0.070000   0.590000 (  7.246364)
  0.470000   0.070000   0.540000 (  7.268461)
  0.520000   0.070000   0.590000 (  7.405976)
=> true

やはり若干こちらのほうが遅いです。

      user     system      total        real
  0.500000   0.070000   0.570000 (  7.776638)
  0.450000   0.070000   0.520000 (  7.524697)
  0.510000   0.070000   0.580000 (  8.555346)
  0.450000   0.070000   0.520000 (  9.625026)
  0.510000   0.060000   0.570000 (  8.554751)
  0.460000   0.070000   0.530000 (  8.833835)
  0.510000   0.070000   0.580000 (  8.960329)
  0.470000   0.070000   0.540000 ( 10.575606)
  0.520000   0.060000   0.580000 (  9.289220)
  0.480000   0.070000   0.550000 (  9.264891)
=> true
  • sqlite3 (AR 版)

劇的に遅い.. ちなみに put/get を 100 回ずつにしたにもかかわらずこの結果。
なにか間違えてる気がします。あとで調べる。

      user     system      total        real
  0.050000   0.010000   0.060000 ( 56.108268)
  0.050000   0.000000   0.050000 ( 55.452589)
  0.060000   0.010000   0.070000 ( 54.861906)
  0.050000   0.010000   0.060000 ( 58.493412)
  0.100000   0.010000   0.110000 ( 56.743238)
  0.060000   0.010000   0.070000 ( 55.952697)
  0.050000   0.000000   0.050000 ( 55.403527)
  0.050000   0.010000   0.060000 ( 55.760519)
  0.060000   0.010000   0.070000 ( 55.553035)
  0.050000   0.010000   0.060000 ( 53.612370)
=> true

本題とは全然関係ない教訓。
AR 版とそうでない版で、テーブル構造が違うわけですが、同じ名前にしているので間違えて利用してしまうことがありました。当然エラーで落ちます。 orz
分かりにくいので、AR 版用のテーブル名は変えることにしようかな、と。