めも帖

「めも帖」代わりにダラダラと書いていったり、めもしたりしているだけです。

CGIのボトルネックはどこか?

というわけで、ベンチマークを昨日とりつつ、夏バテでダウン。
忘れないうちに、めもをしておきます(会社から)。


FileHandleとIO::Fileでは、IO::Fileが若干早い、という程度でした。
それよりも、ファイルの読み込みって良くあると思うのです。そこで、気になったのは、1MBのファイルを読み込むのと、100KBのファイルを10回読み込むのとでどちらが早いのか?ということです。そこで、ベンチマークをとってみました。


#!/usr/local/bin/perl
use strict;
use IO::File;
use Benchmark;
use FileHandle;

print "Content-type: text/html\n\n";
Benchmark::timethese(1000, {
test1 => \&test1,
test2 => \&test2,
}
);
sub test1 {
my $fh = FileHandle->new;
$fh->open( "./data/test.csv" );
my @temp_data = <$fh>;
$fh->close();
}

sub test2 {
for(my $i=0; $i<10; $i++){
&test2_sub;
}
}

sub test2_sub {
my $fh = FileHandle->new;
$fh->open( "./data/test2.csv" );
my @temp_data = <$fh>;
$fh->close();
}

その結果が以下の通り


Benchmark: timing 1000 iterations of test1, test2...
test1: 2 wallclock secs ( 0.79 usr + 0.10 sys = 0.89 CPU) @ 1123.60/s (n=1000)
test2: 8 wallclock secs ( 2.94 usr + 0.66 sys = 3.60 CPU) @ 277.78/s (n=1000)

というわけで、約4倍ほどの差が生じていました。
これって、先述のオブジェクトを読み込みして実行させると、速度が遅くなる、ということからの派生だと思うのです。ファイル読み込みのPMが何度もインスタンス化を繰り返すので、遅くなる、と。これがopenとか、mod_perlだと遅くならないのではないか?と思うのです。そこらへんを検証すればより良いデータですよね、たぶん。