Perl::Lintと Perl::Criticを性能評価してみた
Released Perl::Lint as underdevelopment - その手の平は尻もつかめるさ
ベンチマークコード
#!perl use strict; use warnings; use Benchmark qw/cmpthese/; use Perl::Critic; use Perl::Lint qw/lint/; my $file = shift; my $critic = Perl::Critic->new; my $lint_arg = [$file]; cmpthese(-10, { 'Perl::Lint' => sub { lint($lint_arg); }, 'Perl::Critic' => sub { $critic->critique($file); }, });
比較対象モジュール
https://gist.github.com/syohex/aaf8e58ad9f2b20db034#file-modules-list
に掲載されている 2504モジュールに対して上記のコードを
実行してみました(実行には以下のシェルスクリプトを利用)
#!/bin/sh while read module do echo Benchmarking $module perl bench.pl $(perldoc -lm $module) > compare/$module.log done
実行は以下の通り.
% sh bench.sh < modules.list
結果
分類 | モジュール数 |
---|---|
ベンチマークが実行できたもの | 2235 |
エラーによりベンチマークが実行できなかったもの | 269 |
Perl::Lintが未完成ということもあってか実行できないものが
そこそこあります. あと Compiler::Lexerが結構 Glibcの malloc,
freeエラーチェックに引っかかって abortしてしまっています.
計測データ
https://docs.google.com/spreadsheets/d/1B0GxJFZJSDB6q84gsgRijGnbBxv9b1b5MbVC0cHCA-4/pubhtml
Benchmarkの cmptheseから抜き出したものです..
ヒストグラム
まともに計測できたであろう範囲のヒストグラムを示します.
あからさまに Perl::Lintが早かったものは警告がたくさん出ており,
まともに解析できていないように思えます.
横軸は Perl::Lint視点の性能比です. 0だと Perl::Criticと同程度,
0だと Perl::Criticの倍の性能が出ている, -50だと半分の性能しか
出ていないという意味です.
Perl::Lintの方が早いというのも多いけど, 数だけ見ると Perl::Criticの
方が早かったモジュールの方が多いです. とりあえずどんなファイルに
対しても Perl::Lintの方が早いということはなさそうです.
(VPSという環境が良くなかったのか, 結構測定の度にわりとブレが出たので
そこまで当てにならないかもしれません. 結果が逆転してしまうというような
ものは今のところ確認できていません.)
最大値, 最小値, 平均, 中央値
最大性能比 | 2702% |
最小性能比 | 7% |
平均 | 96.79% |
中央値 | 89% |
(負数のパーセンテージはわかりづらいので以降 +100しています.
100%が Perl::Criticと同程度という意味になります.)
Perl::Lintが Perl::Criticに比べて遅かったモジュール
モジュール名 | 性能比 | 行数 |
---|---|---|
Text::MicroTemplate::EncodedString | 7% | 3 |
HTTP::Server::PSGI::Net::Server::PreFork | 9% | 4 |
LWP::DebugFile | 9% | 5 |
AnyEvent::Server::PSGI | 11% | 4 |
PSGI | 11% | 3 |
行数が少ないものは Perl::Criticの方が早いという結果でした.
package Foo; our $VERSION = '1.23'; 1;
みたいなファイルなので, 実際にこれらのツールを利用することが
ないと思います.