[Perl]更新の有無をチェックするならstatよりファイルテストが高速

キャッシュ更新のためとかでファイルの更新日時をチェックする時はstatよりファイルテストの方がかなり高速

use strict;
package Bench;
my $file = '/tmp/hoge';

sub bench_stat {
        my $last_update = (stat $file)[9];
}

sub bench_file_test {
        my $day = -M $file;
}

sub bench_stat_with_size {
        my ( $size, $last_update ) = (stat $file)[7,9];
}

sub bench_file_test_with_size {
        my ( $day, $size ) = (-M $file, -s _);
}

package main;
use Benchmark qw(timethese cmpthese);
use Class::Inspector;
my $meth = Class::Inspector->methods('Bench');

my $b = timethese( 500000, {
        map { $_ => Bench->can($_) } grep /^bench_/, @$meth
});
cmpthese($b);

>|shell||
Benchmark: timing 500000 iterations of bench_file_test, bench_file_test_with_size, bench_stat, bench_stat_with_size...
bench_file_test: 1 wallclock secs ( 0.23 usr + 0.81 sys = 1.04 CPU) @ 480769.23/s (n=500000)
bench_file_test_with_size: 2 wallclock secs ( 0.40 usr + 0.86 sys = 1.26 CPU) @ 396825.40/s (n=500000)
bench_stat: 2 wallclock secs ( 1.14 usr + 0.86 sys = 2.00 CPU) @ 250000.00/s (n=500000)
bench_stat_with_size: 3 wallclock secs ( 1.26 usr + 0.92 sys = 2.18 CPU) @ 229357.80/s (n=500000)
Rate bench_stat_with_size bench_stat bench_file_test_with_size bench_file_test
bench_stat_with_size 229358/s -- -8% -42% -52%
bench_stat 250000/s 9% -- -37% -48%
bench_file_test_with_size 396825/s 73% 59% -- -17%
bench_file_test 480769/s 110% 92% 21% --
|