Thread Seltsamer Effekt beim Dateieinlesen (31 answers)
Opened by marky at 2011-09-26 11:25

topeg
 2011-09-26 21:03
#152695 #152695
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
use file test.txt with 66060288 Byte
use existing File
preload file
Run Benchmark
Rate read all read all seek read push read push seek
read all 1.16/s -- -1% -1% -2%
read push 1.17/s 1% -- -0% -1%
read push seek 1.17/s 1% 0% -- -1%
read all seek 1.19/s 2% 1% 1% --


Veränderter Code:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(cmpthese);

my $file='test.txt';
my $file_size=63*1024*1024; # 60MB
my $iter=10;

my $size=0;
$size = -s $file if(-f $file);

$/="\x0A";

print "use file $file with $file_size Byte\n";

# create file
if($size != $file_size)
{
  my $lines=int($file_size/81);

  print "create File ($lines lines and 81 chars per Line)\n";

  open(my $fh, '>', $file) or die("$file : $!\n");

  for(1..$lines)
  {
    print $fh join('',map{chr(int(rand(94))+32)}(1..80)).$/;
  }

  my $diff=$file_size-($lines*81);
  while($diff>0)
  {
    print $fh chr(int(rand(95))+32);
    $diff--;
  }

  close($fh);
}
else
{
  print "use existing File\n";
}

# loding file in OS-Filesystem-Cache:
print "preload file\n";
open(my $gfh, '<', $file) or die("$file : $!\n");
{
  local $/=undef;
  <$gfh>;
}

print "Run Benchmark\n";
cmpthese($iter, {
'read all' => sub{
    open(my $fh, '<', $file) or die("$file : $!\n");
    my @l=<$fh>;
    close($fh);
  },
'read push' => sub{
    open(my $fh, '<', $file) or die("$file : $!\n");
    my @l;
    while(<$fh>)
    { push(@l,$_); }
    close($fh);
  },
'read all seek' => sub{
    # goto file start
    seek($gfh,0,0);

    my @l=<$gfh>;
  },
'read push seek' => sub{
    # goto file start
    seek($gfh,0,0);

    my @l;
    while(<$gfh>)
    { push(@l,$_); }
  },

});


Die Werte liegen bei mir alle so dicht bei einander, dass sie praktisch gleich sind. Alle Werte liegen innerhalb der Schwankungen durch Störungen vom System. 10 Durchläufe sind einfach nicht Aussagekräftig genug.


das ganze mit einer 1MB Datei und 1000 Durchläufen:
Code: (dl )
1
2
3
4
5
6
7
8
9
use file test.txt with 1048576 Byte
create File (12945 lines and 81 chars per Line)
preload file
Run Benchmark
Rate read all read push read push seek read all seek
read all 75.5/s -- -1% -2% -3%
read push 76.2/s 1% -- -1% -2%
read push seek 77.0/s 2% 1% -- -1%
read all seek 77.6/s 3% 2% 1% --


Das ganze habe ich auf einem Linux getestet. (Kernel 3.0)
Andere Betriebssysteme können natürlich auch andere Werte liefern.

View full thread Seltsamer Effekt beim Dateieinlesen