大量データ処理、トークンカウント
引き続き効率測定。今度は文字の出現回数を調べる場合。
対象データは前回同様に300万行、600MB程度。
コードはループ内の該当箇所のみ記述。
- 正規表現 所要時間22.8sec
$count = $_ =~ s/ / /g;
- index 所要時間25.7sec
$count = 0; $pos = -1; while(($pos = index($_,' ',$pos + 1)) >= 0){ $count++; }
- tr 所要時間6.8sec
$count = $_ =~ tr/ / /;
- split 所要時間53.4sec
@list = split(/ /,$_); $count = scalar(@list) -1;
- split警告付き 所要時間20.7sec
$count = split(/ /,$_); $count--;
- 正規表現(複数) 所要時間12.4sec
$count = $_ =~ s/, /, /g;
- index(複数) 所要時間14.0sec
$count = 0; $pos = -2; while(($pos = index($_,', ',$pos + 2)) >= 0){ $count++; }
単一文字ならtrが最速の模様。
2文字以上の連続するトークンには使用できないので、その場合は
正規表現でのカウントが無難かな。
またsplitが重いのは前回の通りだけど、配列に格納する処理が
更に重いので必要ない限りは、配列への格納は避けた方が良い。