=~ と 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)


もう少し差があるのかと思っていましたが、案外 正規表現も早いのですね ^^)