Thread Seltsamer Effekt beim Dateieinlesen
(31 answers)
Opened by marky at 2011-09-26 11:25
Unter Windows würde wirklich aus Probleme mit dem Datendurchsatz setzen. Gerade XP ist dabei nicht besonders gut. Aber ich hätte nicht gedacht, dass es so extrem ausfallen kann.
Bei Linux könnte es mit der Kernelversion zusammenhängen. In den Letzten fünf Versionen hat sich einiges getan was die Caches betrifft. Hier kann es auch zu ungünstigen Wartezyklen kommen. Die Anzahl der Kerne ist nicht so wichtig, da Perl als ein Prozess läuft. Viel mehr kommt es hier auf den Speicherdurchsatz und den Prozessortakt an. Um zu zeigen dass es nicht an Perl liegt. In dem Benchmark wird nur mit dem IO-Layer von Perl gearbeitet (setzt perl 5.8 voraus): Code (perl): (dl
)
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 #!/usr/bin/perl use strict; use warnings; use Benchmark qw(cmpthese); my $file='test.txt'; my $file_size=1*1024*1024; # 1MB my $iter=1000; my $data=''; { my $lines=int($file_size/81); print "create DATA ($lines lines and 81 chars per Line)\n"; for(1..$lines) { $data.=join('',map{chr(int(rand(94))+32)}(1..80)).$/; } my $diff=$file_size-($lines*81); while($diff>0) { $data.=chr(int(rand(95))+32); $diff--; } } print "set FileHandle\n"; open(my $gfh, '<', \$data) or die("DATA : $!\n"); print "Run Benchmark\n"; cmpthese($iter, { 'read_all' => sub{ # goto start seek($gfh,0,0); my @l=<$gfh>; }, 'read_push' => sub{ # goto start seek($gfh,0,0); my @l; while(<$gfh>) { push(@l,$_); } }, }); Das Ergebnis zeigt dass es kaum einen unterschied gibt: Code: (dl
)
1 create DATA (12945 lines and 81 chars per Line) Sollte bei dir was anderes heraus kommen könnte Perl ein Problem mit der Codeoptimierung haben. (ich nutze bei mir gerade 5.10) |