Das Script:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use strict;
use Benchmark;
sub test1 {
open FILE,'<',$0 or die $!;
local $/;
print STDERR <FILE>;
close FILE;
}
sub test2 {
open FILE,'<',$0 or die $!;
while (<FILE>) {
print STDERR $_;
}
close FILE;
}
sub test3 {
open my $fh,'<',$0 or die $!;
local $/;
print STDERR <$fh>;
close $fh;
}
sub test4 {
open my $fh,'<',$0 or die $!;
while (<$fh>) {
print STDERR $_;
}
close FILE;
}
###############################################
sub test5 {
require IO::File;
my $fh = IO::File->new($0,'r') or die $!;
print STDERR <$fh>;
$fh->close();
}
timethese(1_000_000,{
'Mit "open FILE" und ohne "while"' => \&test1,
'Mit "open FILE" und mit "while"' => \&test2,
'Mit "open $fh" und ohne "while"' => \&test3,
'Mit "open $fh" und mit "while"' => \&test4,
'Mit "IO::File"' => \&test5
});
Ergebnis:
koeppea@foxi:~/perl_scripts> tail -f benchmark.txt
Benchmark: timing 1000000 iterations of Mit "IO::File", Mit "open $fh" und mit "while", Mit "open $fh" und ohne "while", Mit "open FILE" und mit "while", Mit "open FILE" und ohne "while"...
Mit "IO::File": 540 wallclock secs (456.56 usr + 76.48 sys = 533.04 CPU) @ 1876.03/s (n=1000000)
Mit "open $fh" und mit "while": 128 wallclock secs (97.60 usr + 29.50 sys = 127.10 CPU) @ 7867.82/s (n=1000000)
Mit "open $fh" und ohne "while": 45 wallclock secs (33.78 usr + 11.26 sys = 45.04 CPU) @ 22202.49/s (n=1000000)
Mit "open FILE" und mit "while": 114 wallclock secs (85.77 usr + 27.13 sys = 112.90 CPU) @ 8857.40/s (n=1000000)
Mit "open FILE" und ohne "while": 34 wallclock secs (22.93 usr + 10.84 sys = 33.77 CPU) @ 29612.08/s (n=1000000)
koeppea@foxi:~/perl_scripts>
OK Das Ergebnis mit
IO::File würde wahrscheinlich besser ausfallen wenn mehr Dateien damit gelesen werden würden. Nur ich brauch das nur einmal pro Ausführung.
Gruß Alex