amari3のはてなダイアリー このページをアンテナに追加 RSSフィード

2011-12-16

[][][]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 を採用しようと考えてる。速度面以外でも

  • オブジェクトの生成の必要がなくカジュアルに使える
  • ログレベルが適度な数でどれを使うか迷う事が少なくなる(気がする)
  • 覚えることが少ないんで他のエンジニアも簡単に使える(と思う)

といったところが大きいかなと。