メッセージ格納先別の性能比較
だいぶ種類も増えてきたので、ちょっと比較してみます。
ベンチマークプログラムは前回同様なので、リソースは全然使いきれてません。
並列度は 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 (従来版)
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
- MySQL (AR 版)
従来版よりも多少遅くなりました。
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
- postgresql (従来版)
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
- postgresql (AR 版)
やはり若干こちらのほうが遅いです。
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 版用のテーブル名は変えることにしようかな、と。