File: read_vs_sysread.pl

package info (click to toggle)
libredis-fast-perl 0.22%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 488 kB
  • sloc: perl: 2,539; makefile: 3
file content (65 lines) | stat: -rw-r--r-- 1,937 bytes parent folder | download | duplicates (4)
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
    }

}