最終更新日:1999年 4月11日(日)

Performance


Perl の特徴の1つに同じ処理を色々な記法で実現できることが挙げられるでしょう。

然し、どのような記述をしても全く同じでしょうか? 分かり易さ、保守性、メモリ消費量などは書き方によって変わってくると思います。

ここでは、Perl の実行性能についてこだわってみようと思います。

測定環境
測定マシン
PC本体	富士通 FMV DESK POWER S
CPU	Pentium 100MHz
メモリ	48MB
OS	Windows95( 4.00.950a )
Perl のバージョン
	Win32 port Copyright (c) 1995-1996 Microsoft Corporation.
		All rights reserved.
	Developed by ActiveWare Internet Corp., http://www.ActiveWare.com

Perl for Win32 Build 303 - Built 22:00:46 Mar 13 1997
This is perl, version 5.003_07
Copyright 1987-1996, Larry Wall

	+ suidperl security patch
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5.0 source kit.
測定方法

測定は時間( sec )で行ないましたが、 絶対時間は測定環境により大きく左右されるので、 測定値ではなく、処理時間の傾向として捉えて下さい。
ループ

配列をフェッチする時 for, foreach などのループ処理を行ないます。 そこで、ループ自体の処理時間を測定してみました。

No. 処理                        	時間
 1. foreach(@array){}           	 0.2
 2. for($i=0; $i<@array; $i++){}	 3.6
 3. $array=@array;
    for($i=0; $i<$array; $i++){}	 0.7

意外にも foreach はダントツでした。 つまり、配列の順序を気にしない場合は foreach 文を使った方がいいようです。 また、配列の順序を気にする場合でも、安易にループ数に @array を使用せず、 スカラー値に置き換えて行なうといいようです。

文字列操作 - 文字列の結合

文字列の連結は join() が良いと言われますが、どれくらいの差があるのでしょうか。

No. 処理                                	時間
 1. $str1.$str2.・・.$str10             	4.1
 2. "$str1$str2・・$str10"              	4.3
 3. join('',$str1,$str2,・・,$str10)    	4.9
 4. join('',@str)                       	3.8

結論として、配列を結合する場合は join() が有効で、 単に変数を連結する場合は連結子「.」が速いようです。

正規表現 - oオプション

Perl では正規表現を使用するケースが多いですが、 o オプションを使用するとどれくらい有効でしょうか。

No. 処理                        	時間
 1. $_=~/9/;                    	 3.4
 2. $_=~/9/o;                   	 2.0

結構、有効なようです。 動的に変わらない正規表現はオマジナイとして使用しておくと、 ご利益がありそうです。

正規表現 - \d と [0-9]

正規表現では \d などのように文字クラスを表わす記述があります。 その意味する正規表現と比較するとどの程度有効なのでしょうか。

No. 処理                        	時間
 1. $_=~/[0-9]/;                	 3.1
 2. $_=~/\d/;                   	 2.2
 3. $_=~/[0-9]/o;               	 2.0
 4. $_=~/\d/o;                  	 1.9

記述ばかりではなく、実際に動作も専用の処理になっているようです。 ですから、略号で記述できる場合は正規表現では記述しない方が良いようです。

正規表現と tr, chomp

よく取沙汰される話題に tr と正規表現ではどちらがいいか、 というものがあります。\r,\n を削除する例で、 ついでに chomp も調べてみましょう

No. 処理                        	時間
 1. $_=~tr/\r\n//d;             	 2.0
 2. $_=~s/[\r\n]$//o;           	 3.3
 3. chomp;                      	 0.3

やはり、tr の方が速いようです。 然し、 chomp の代わりにはなりません。 つまり、専用の命令がある場合は迷わずその命令を使用した方が良さそうです。

配列 - 初期値の設定

ローカル変数を使用する場合、初期値や定数を設定するケースがあります。 見易く書く、単純に書く、色々とありそうですが、どれくらいの差があるでしょうか。

No. 処理                        	時間
 1. my ($a,$b,$c)=($_,$_,$_);   	3.3
 2. my $a=$_; $b=$_; $c=$_;     	1.8

どちらも似たようなものに見えますが、結果は結構違います。

配列 - 要素の追加

配列に要素を追加する処理も良く使用しますが、 一応、量ってみます。

No. 処理                        	時間
 1. push(@a,$_);                	3.1
 2. $a[@a]=$_;                  	6.8
 3. $a[$i++]=$_;                	5.3

やはり、予想通りでした。専用の命令は特化されているようです。

ハッシュ - 多次元処理

ハッシュ変数は何かと便利ですが、多次元にするとどうでしょうか。

No. 処理                        	時間
 1. $hash{'key'}->{$_}++;       	2.2
 2. $hash{"key\t$_"}++;         	1.5

意外とハッシュは重い(多分、メモリも)ことがわかります。 できるだけ、多次元処理は工夫して少なくする方がいいかも。


戻る (C)Copyright 1999 ShinSoft. All rights reserved. メール