Das Cachen von Seiten scheint bei dir zur Obsession zu werden, oder? Hast du denn jemals geprüft, wie gut sich dein Betriebssystem verhält? Ich habe ja schön öfters gesagt, dass das Betriebssystem sehr gut cachen kann. Hier ein Beweis (mit FreeBSD 4.9, perl5.8.8):
use Time::HiRes qw(gettimeofday tv_interval);
my $bigfile = shift or die "Big file?";
sub openandreadbigfile {
open my $fh, "<:raw", $bigfile or die $!;
local $/;
my $xxx = <$fh>;
undef;
}
while () {
my $t0 = [gettimeofday];
openandreadbigfile();
my $elapsed = tv_interval($t0);
warn $elapsed, "\n";
}
Wenn ich eine sehr große Datei lade, z.B. die Sourcen von Mozilla (30MB), dann sieht es so aus:
perl5.8.8 /tmp/open.pl /usr/ports/distfiles/mozilla-1.7.12-source.tar.bz2
2.747017
0.438312
0.43884
0.44037
0.450289
0.448169
0.45606
0.434542
0.435767
Sprich: beim ersten Mal wird von der Platte gelesen, danach geht es recht schnell aus dem RAM.
Die Datei auf eine RAM-Disk zu packen, bringt nichts: es wird nicht schneller:
perl5.8.8 /tmp/open.pl /tmp/mozilla-1.7.12-source.tar.bz2
1.39426
0.447927
0.432142
0.459948
0.434598
0.438158
Natürlich: wenn sich die 30MB bereits in einem Perl-SV befinden würden, wäre man noch schneller. Wenn deine Dateien wesentlich kleiner sind, wirst du den Geschwindigkeitszuwachs aber nicht bemerken. Aber wenn du wirklich in einem Perl-Skalar cachen willst, dann könntest du es schon zur Startzeit des Apache machen.
Und hast du eigentlich meinen send_fd-Rat befolgt?