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
|
use 5.18.1;
use Time::HiRes qw(gettimeofday tv_interval);
my $total_bytes = 5_000_000;
my @lengths = (1, 2, 3, 4, 10, 50, 100, 1_000, 10_000);
foreach my $length (@lengths) {
my $packet_nb = int($total_bytes / $length);
my %results;
my $method = "read";
if (my $pid = open(my $kid, "|-")) {
# parent
my $data = 'x' x $length;
my $i = $packet_nb;
my $t0 = [gettimeofday];
while ($i--) {
print $kid $data;
}
close($kid) or warn "kid exited with $?";
my $elapsed = tv_interval ($t0); # equivalent code
say "$method: $packet_nb packets of size $length : $elapsed sec";
$results{$method}{$length} = $elapsed;
} else {
# child
my $data;
my $i = 0;
while ($i < $packet_nb) {
read STDIN, $data, $length, $i*$length;
$i++;
}
length($data) eq $length * $packet_nb
or say "wrong length : got " . length($data) . " instead of " . $length * $packet_nb;
exit; # don't forget this
}
my $method = "sysread";
if (my $pid = open(my $kid, "|-")) {
# parent
my $data = 'x' x $length;
my $i = $packet_nb;
my $t0 = [gettimeofday];
while ($i--) {
syswrite $kid, $data, $length;
}
close($kid) or warn "kid exited with $?";
my $elapsed = tv_interval ($t0); # equivalent code
say "$method: $packet_nb packets of size $length : $elapsed sec";
$results{$method}{$length} = $elapsed;
} else {
# child
my $data;
my $i = 0;
while ($i < $packet_nb) {
sysread STDIN, $data, $length, $i*$length;
$i++;
}
length($data) eq $length * $packet_nb
or say "wrong length : got " . length($data) . " instead of " . $length * $packet_nb;
exit; # don't forget this
}
}
|