ようへいの日々精進XP

よかろうもん

パターンマッチでモード修飾子 o を使うと処理が少し速くなるんだなあ

概要

  • td-agent を介して redis に書き込んだハッシュレコード(Apache ログ)を取り出してパターンにマッチするコードを書いていて、モード修飾子 o を付けた場合とそうでない場合のベンチマークを比較してみた

ベンチマーク

環境

  • Debian 6.0.7(LXC コンテナ)
  • Apache 2.2.6
  • Redis 2.6.15
  • td-agent 0.10.36

レコード件数

td-agent を介して放り込んだ Apache ログファイル。

f:id:inokara:20130825115007p:plain

約 8000 件強のログが記録されている。

レコードの内容

以下のようなログが記録されている。

f:id:inokara:20130825115200p:plain

ruby から取り出すと以下のように取り出すことが出来る。

f:id:inokara:20130825115745p:plain

ベンチマークコード

元々ベンチマークを目的としていたわけではないが以下のように書いてみた。

リクエストメソッドが 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回だけコンパイルを行うので処理効率が上がることから処理時間が多少上がるみたいですなあ。