]> git.vpit.fr Git - perl/modules/IPC-MorseSignals.git/blob - samples/bench.pl
Importing IPC-MorseSignals-0.02.tar.gz
[perl/modules/IPC-MorseSignals.git] / samples / bench.pl
1 #!/usr/bin/perl -T
2
3 use strict;
4 use warnings;
5
6 use POSIX qw/SIGINT SIGTERM SIGKILL EXIT_SUCCESS/;
7
8 use lib qw{blib/lib};
9
10 use IPC::MorseSignals qw/msend mrecv/;
11
12 my @res;
13
14 sub tryspeed {
15  my ($l, $n) = @_;
16  my $speed = 2 ** 16;
17  my $ok = 0;
18  my $desc;
19  while ($speed && $ok < $n) {
20   $desc = "$n sends of $l bytes at $speed bits/s";
21   $speed /= 2;
22   $ok = 0;
23   print STDERR "try $desc";
24 TRY:
25   for (1 .. $n) {
26    print STDERR ".";
27    my @alpha = ('a' .. 'z');
28    my $msg = join '', map { $alpha[rand @alpha] } 1 .. $l;
29    pipe my $rdr, my $wtr or die "$desc: pipe() failed : $!";
30    my $pid = fork;
31    if (!defined $pid) {
32     die "$desc: fork() failed : $!";
33    } elsif ($pid == 0) {
34     close $rdr;
35     local @SIG{qw/USR1 USR2/} = mrecv sub {
36      print $wtr $_[0], "\n";
37      close $wtr;
38      exit EXIT_SUCCESS;
39     };
40     1 while 1;
41    }
42    close $wtr or die "$desc: close() failed : $!";
43    eval {
44     local $SIG{ALRM} = sub { die 'alarm' };
45     my $a = (int(100 * (3 * $l) / $speed) || 1);
46     $a = 10 if $a > 10;
47     alarm $a;
48     msend $msg => $pid, $speed;
49     waitpid $pid, 0;
50    };
51    alarm 0;
52    if ($@) {
53     kill SIGINT,  $pid;
54     kill SIGTERM, $pid;
55     kill SIGKILL, $pid;
56     close $rdr or die "$desc: close() failed : $!";
57     print STDERR " timeout\n";
58     next TRY;
59    }
60    my $recv = do { local $/; <$rdr> };
61    close $rdr or die "$desc: close() failed : $!";
62    if ($recv) {
63     chomp $recv;
64     if ($msg eq $recv) {
65      ++$ok;
66     } else {
67      print STDERR " transfer error\n";
68      last TRY;
69     }
70    } else {
71     print STDERR " transfer failure\n";
72     last TRY;
73    }
74   }
75  }
76  if ($speed) {
77   print STDERR " OK\n\n";
78   $desc = "$l bytes sent $n times";
79   push @res, "$desc at $speed bits/s";
80  }
81 }
82
83 tryspeed 4, 1;
84 tryspeed 4, 5;
85 tryspeed 4, 10;
86 tryspeed 4, 50;
87 tryspeed 16, 1;
88 tryspeed 16, 5;
89 tryspeed 16, 10;
90 tryspeed 64, 1;
91 tryspeed 64, 5;
92 tryspeed 64, 10;
93 tryspeed 256, 1;
94 tryspeed 256, 5;
95 tryspeed 1024, 1;
96
97 print STDERR "=== Summary ===\n";
98 print STDERR "$_\n" for @res;