マスタリング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