Perl の Log 系モジュールのベンチマークを取ってみた
今年の YAPC や他のセミナーでも、ログの重要性をよく聞いたので、ログをしっかり取るようにしようと考えた。そこで Perl の主要(だと思われる)Log 系のモジュールのベンチマークを取ってみた。
環境及びモジュール
- Perl-5.14.2
- Log::Dispatch-2.29
- Log::Hanlder-0.71
- Log::Minimal-0.09
- warn
前提条件
- 基本的にはほとんどカスタマイズせずに実行
- 出力される文字数等にバラツキが出るがデフォルトの状態で比較したいので
- 出力先は標準エラー
ベンチマーク用のスクリプト
use strict; use warnings; use Benchmark qw(timethese cmpthese); use Log::Handler; use Log::Dispatch; use Log::Minimal; my $count = shift || 1000; # Log::Handler my $logh = Log::Handler->new(); $logh->add( screen => +{ log_to => 'STDERR', maxlevel => 'debug', } ); # Log::Dispatch my $logd = Log::Dispatch->new(outputs => [[ "Screen", min_level => 'debug', stderr => 1, newline => 1, ]]); my $result = timethese($count, +{ log_handler => sub { $logh->info('log'); }, log_dispatch => sub { $logd->info('log'); }, log_minimal => sub { infof('log'); }, warn => sub { warn "log\n"; }, }); cmpthese $result;
実行結果
Benchmark: timing 10000 iterations of log_dispatch, log_handler, log_minimal, warn... log_dispatch: 2 wallclock secs ( 1.22 usr + 0.13 sys = 1.35 CPU) @ 7407.41/s (n=10000) log_handler: 1 wallclock secs ( 0.54 usr + 0.24 sys = 0.78 CPU) @ 12820.51/s (n=10000) log_minimal: 1 wallclock secs ( 0.30 usr + 0.15 sys = 0.45 CPU) @ 22222.22/s (n=10000) warn: 0 wallclock secs ( 0.01 usr + 0.04 sys = 0.05 CPU) @ 200000.00/s (n=10000) (warning: too few iterations for a reliable count) Rate log_dispatch log_handler log_minimal warn log_dispatch 7407/s -- -42% -67% -96% log_handler 12821/s 73% -- -42% -94% log_minimal 22222/s 200% 73% -- -89% warn 200000/s 2600% 1460% 800% --
標準の warn が圧倒的に早いのは当然として、Log::Minimal のスコアが良い感じです。
まとめ
今回のベンチマークの結果を見て、Log::Minimal を採用しようと考えてる。速度面以外でも
- オブジェクトの生成の必要がなくカジュアルに使える
- ログレベルが適度な数でどれを使うか迷う事が少なくなる(気がする)
- 覚えることが少ないんで他のエンジニアも簡単に使える(と思う)
といったところが大きいかなと。