マスタリングPerl (6章 Perlのベンチマーク)

勉強メモ。

実行時間のベンチマーク

  • ウォールクロック ->プログラムの開始時と終了時に時計を見て計測
  • プログラム内で処理前後のtime値を取得し計測
  • OS標準のtimeコマンドで計測
$ time program.pl
  • Benchmarkモジュール
#!/us/bin/perl                                                                                                                                

use strict;
use warnings;
use Benchmark;

my $start = Benchmark->new;

<=== code ===>

my $end = Benchmark->new;

my $diff = timediff($end, $start);
print timestr($diff). "\n";

__END__

コードの比較

プログラム全体の実行時間を比較することは、重要ではない。
実装の違いを比較することが重要である。
実装の異なる部分を抽出し、ちいさなプログラムで比較する。

  • timethese関数

Benchmarkモジュールのtimethese関数を使用して、特定数の繰り返しを実施した際のベンチマークが取得できる。
第一引数は繰り返し回数、第二引数は比較するコードを無名ハッシュで指定する。

#!/usr/bin/perl

use strict;
use warnings;
use Benchmark;

timethese(10000, {
  'code1' => '<=== code ===>',
  'code2' => '<=== code ===>',
  }
);

メモリ使用率

Perlはメモリを、以下のように制御する。

  • さらなるメモリが必要な場合、かなりのメモリ量を確保する。(ユーザが以降もさらなるメモリを必要とすると予想するため)
  • 一度確保したメモリは、OSに返さない。不要になったメモリは再利用を試みる。
  • 格納したデータ以上のメモリサイズを消費する。

Devel::Sizeモジュールを使用すると、変数がどれくらいのメモリを占有しているか確認することができる。

  • size関数 ->該当のデータ構造サイズを示す。ただし、配列などは、そのもののサイズを示す。(格納されているデータの総サイズではない)
  • total_size関数 ->配列などの内部データの総サイズを示す。
#!/usr/bin/perl

use strict;
use warnings;
use Devel::Size qw/size total_size/;

my $data = 123456789;
my @array = ($data) x 300;

print '$data\'s size: ', size($data), "\n";                  # $data's size: 16
print '@array\'s size: ', size(\@array), "\n";               # @array's size: 1300
print '@array\'s total size: ', total_size(\@array), "\n";   # @array's total size: 6100

__END__

perlbenchツール

システムにインストールされているperlインタプリタを比較する。
最初のperlインタプリタ(A)を基準として評価する。

$ perlbench-run /usr/bin/perl
A) perl-5.10.0
	version     = 5.01
	path        = /usr/bin/perl


                           A
                         ---
arith/mixed              100
arith/trig               100
array/copy               100
array/foreach            100
array/index              100
array/pop                100
array/shift              100
array/sort-num           100
array/sort               100
call/0arg                100
call/1arg                100
call/2arg                100
call/9arg                100
call/empty               100
call/fib                 100
call/method              100
call/wantarray           100
hash/copy                100
hash/each                100
hash/foreach-sort        100
hash/foreach             100
hash/get                 100
hash/set                 100
loop/for-c               100
loop/for-range-const     100
loop/for-range           100
loop/getline             100
loop/while-my            100
loop/while               100
re/const                 100
re/w                     100
startup/fewmod           100
startup/lotsofsub        100
startup/noprog           100
string/base64            100
string/htmlparser        100
string/index-const       100
string/index-var         100
string/ipol              100
string/tr                100

AVERAGE                  100

Results saved in file:///home/username/tmp/perlbench-0.93/benchres-001/index.html

*1

*1:システムにインタプリタが一つしかインストールされていないため、あまり参考にならずorz