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が結構 Glibcmalloc,
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;

みたいなファイルなので, 実際にこれらのツールを利用することが
ないと思います.

Perl::Lintが Perl::Criticに比べて早かったモジュール

モジュール名 性能比 行数
CPAN::FirstTime 2702% 2095
Unicode::Collate::CJK::Stroke 1689% 2530
Devel::PPPort 1117% 9169
Unicode::Collate::CJK::Zhuyin 986% 3176
Unicode::Collate::CJK::Pinyin 830% 3041


行数が多いものが多いですが, 前述の通りまともに解析されていない
可能性があるので, あてにならないと思います.


おわりに

Perl::Lintには現状まだ測定できないもの, 測定が正しく行えるものが
たくさんあるので, 現時点で比較というのは早すぎたかもしれません.
Perl::Criticと同程度の安定性が実現できたときに再度計測できればと
思います.


計測等に問題がありましたらお知らせください.