続 Perl::Lintと Perl::Criticを性能評価してみた

@さんより最新版では早くなっているという
ことなので改めて計測してみました.


傾向を見るためにファイルの行数別に測定を分けてみました.

比較対象

  • Perl::Lint 2014年 8月 27日時点の最新版(github)
  • Perl::Critic 1.122

ベンチマークコード

#!perl
use strict;
use warnings;

use Benchmark qw/cmpthese/;
use Perl::Critic;
use Perl::Lint;

my $file = shift;
my $linter = Perl::Lint->new;
my $critic = Perl::Critic->new;
cmpthese(-3, {
  'Perl::Lint' => sub { $linter->lint($file); },
  'Perl::Critic' => sub { $critic->critique($file); },
});


7746ファイルに対して上記のコードを実行.
詳しくは見ていないが, 2割程度のファイルは Perl::Lintでは
glibcmalloc, freeチェックにひっかかったり, その他エラーで
結果が得られなかった.

グラフの見方

性能比は Benchmarkモジュールの結果そのままで, Perl::Lint視点です.
0%だとPerl::Criticと差がなく, 100%だと Perl::Criticの 2倍早い,

  • 50%だと半分の性能となります.

50行未満のファイル(1155ファイル)

性能比(%)
最大値 144
最小値 -94
平均値 22.03
中央値 22

100行未満のファイル(1412ファイル)

性能比(%)
最大値 167
最小値 -93
平均値 37.10
中央値 38

200行未満のファイル(1553ファイル)

性能比(%)
最大値 219
最小値 -87
平均値 45.64
中央値 45

500行未満のファイル(1229ファイル)

性能比(%)
最大値 267
最小値 -85
平均値 56.67
中央値 56

1000行未満のファイル(965ファイル)

性能比(%)
最大値 279
最小値 -95
平均値 86.25
中央値 77

1000行以上のファイル(294ファイル)

右端の方は時空が歪んでいます

性能比(%)
最大値 3339
最小値 -93
平均値 80.04
中央値 48

おわりに

@さんのおっしゃるとおり確かに早くなっているっぽいです.
前回のときは, Perl::Criticの方が早い方が多かったんですけど, 今回計測
したら Perl::Lintの方が早いものが多かったです. ファイル長が長いほど,
Perl::Lintの方が高速であるという傾向があるのでいい感じです.


ただ問題がありまして, 上述の通り, 前回同様かなりのファイルが
計測できない, 正しくチェックされないという事態となりました.
Perl::Lintの方が早すぎる結果が得られている場合はだいたい正しく
チェックされていないと考えてよいです.


ツールツールだけに一つでもまともに動かないというものが
あると困るので現状はとても使用できないという感じでしょうか.
ツールの用途として, 早いけど正しく問題点が指摘されないよりかは
遅くてもちゃんと指摘してくれる方がよいので, 使えるようになるのは
だいぶ先かと思います. 正確さが Perl::Criticと同等になったときに
また比較したいと思います.