概要
- td-agent を介して redis に書き込んだハッシュレコード(Apache ログ)を取り出してパターンにマッチするコードを書いていて、モード修飾子 o を付けた場合とそうでない場合のベンチマークを比較してみた
ベンチマーク
環境
レコード件数
td-agent を介して放り込んだ Apache ログファイル。
約 8000 件強のログが記録されている。
レコードの内容
以下のようなログが記録されている。
ruby から取り出すと以下のように取り出すことが出来る。
ベンチマークコード
元々ベンチマークを目的としていたわけではないが以下のように書いてみた。
リクエストメソッドが GET
のレコードを検索するつもりのスクリプト...。
結果
ということで、以下のパターンでベンチマークを取得してみた。
- モード修飾子 o 付きで且つパターンにマッチ
- モード修飾子 o 付きで且つパターンにはアンマッチ
- モード修飾子 o 無しで且つパターンにマッチ
- モード修飾子 o 無しで且つパターンにはアンマッチ
モード修飾子 o 付きで且つパターンにマッチ
if /#{ret[2]}/o =~ pattern
1 回目 | 2 回目 | 3 回目 | |
---|---|---|---|
real | 0m3.266s | 0m3.166s | 0m3.169s |
user | 0m1.572s | 0m1.580s | 0m1.600s |
sys | 0m0.788s | 0m0.724s | 0m0.720s |
モード修飾子 o 付きで且つパターンにアンマッチ
if /#{ret[2]}/o =~ pattern
1 回目 | 2 回目 | 3 回目 | |
---|---|---|---|
real | 0m3.140s | 0m3.186s | 0m3.444s |
user | 0m1.588s | 0m1.532s | 0m1.700s |
sys | 0m0.728s | 0m0.776s | 0m0.768s |
モード修飾子 o 無しで且つパターンにマッチ
if /#{ret[2]}/ =~ pattern
1 回目 | 2 回目 | 3 回目 | |
---|---|---|---|
real | 0m3.407s | 0m3.366s | 0m3.384s |
user | 0m1.872s | 0m1.792s | 0m1.752s |
sys | 0m0.680s | 0m0.740s | 0m0.792s |
モード修飾子 o 無しで且つパターンにアンマッチ
if /#{ret[2]}/ =~ pattern
1 回目 | 2 回目 | 3 回目 | |
---|---|---|---|
real | 0m3.561s | 0m3.371s | 0m3.543s |
user | 0m1.836s | 0m1.748s | 0m1.864s |
sys | 0m0.808s | 0m0.788s | 0m0.752s |
ということで
結果
- モード修飾子 o 付きでパターンにマッチした場合が処理が一番速い
- レコード数が多ければ多くなるほど処理時間に差が出てくると思われる
締め
モード修飾子 o はスクリプトの実行時に1回だけコンパイルを行うので処理効率が上がることから処理時間が多少上がるみたいですなあ。