=~ と index()
Perl でコードを書いていると if ($s =~ /s/) などと書いてしまうが、これなら if (index($s, 'p') >=0) の方が早そうです。
どれくらい速度が違うのか計ってみました。
#!/usr/bin/perl use strict; use Time::HiRes qw(gettimeofday); my $n = 100000; my $s = ''; for (my $i = 0; $i < 256; $i++) { $s .= chr(rand(256)); } my $start_time = micro_sec(); for (my $i = 0; $i < $n; $i++) { } my $end_time = micro_sec(); my $loop_time = $end_time - $start_time; my $r; $start_time = micro_sec(); for (my $i = 0; $i < $n; $i++) { $r = index($s, 'p') >= 0 } $end_time = micro_sec(); my $index_time = $end_time - $start_time - $loop_time; $start_time = micro_sec(); for (my $i = 0; $i < $n; $i++) { $r = $s =~ /p/; } $end_time = micro_sec(); my $regex_time = $end_time - $start_time - $loop_time; print sprintf("%-10s %8.3f mS\n", "index()", $index_time * 1000); print sprintf("%-10s %8.3f mS\n", "=~", $regex_time * 1000); print sprintf("%-10s %8.2f\n", "rate = ",$regex_time / $index_time); sub micro_sec { my ($sec, $usec) = gettimeofday(); return $sec + $usec/1e6; }
結果は、index() の方が =~ に比べ 1.3 〜 2 倍程度早いようです (Perl 5.8.8 MacOS/X 10.4.9)
もう少し差があるのかと思っていましたが、案外 正規表現も早いのですね ^^)