Annotation of embedaddon/bird2/proto/perf/parse.pl, revision 1.1

1.1     ! misho       1: #!/usr/bin/perl
        !             2: 
        !             3: use File::Temp ();
        !             4: 
        !             5: package row;
        !             6: 
        !             7: use Moose;
        !             8: 
        !             9: has 'exp' => ( is => 'ro', 'isa' => 'Num' );
        !            10: has 'gen' => ( is => 'ro', 'isa' => 'Num' );
        !            11: has 'temp' => ( is => 'ro', 'isa' => 'Num' );
        !            12: has 'update' => ( is => 'ro', 'isa' => 'Num' );
        !            13: has 'withdraw' => ( is => 'ro', 'isa' => 'Num' );
        !            14: 
        !            15: sub reduce {
        !            16:   my $self = shift;
        !            17: 
        !            18:   my $N = 1 << $self->exp;
        !            19:   return row->new(
        !            20:     exp => $self->exp,
        !            21:     gen => $self->gen / $N,
        !            22:     temp => $self->temp / $N,
        !            23:     update => $self->update / $N,
        !            24:     withdraw => $self->withdraw / $N
        !            25:   );
        !            26: }
        !            27: 
        !            28: sub dump {
        !            29:   my ($self, $fh) = @_;
        !            30: 
        !            31:   print $fh join ",", $self->exp, $self->gen, $self->temp, $self->update, $self->withdraw;
        !            32:   print $fh "\n";
        !            33: }
        !            34: 
        !            35: package results;
        !            36: 
        !            37: use Moose;
        !            38: 
        !            39: has 'name' => (
        !            40:   is => 'ro',
        !            41:   isa => 'Str',
        !            42:   required => 1,
        !            43: );
        !            44: 
        !            45: has 'date' => (
        !            46:   is => 'ro',
        !            47:   isa => 'Str',
        !            48:   required => 1,
        !            49: );
        !            50: 
        !            51: has 'reduced' => (
        !            52:   is => 'ro',
        !            53:   isa => 'Bool',
        !            54:   default => 0,
        !            55: );
        !            56: 
        !            57: has 'rows' => (
        !            58:   is => 'ro',
        !            59:   isa => 'ArrayRef[row]',
        !            60:   default => sub { [] },
        !            61: );
        !            62: 
        !            63: has 'stub' => (
        !            64:   is => 'ro',
        !            65:   isa => 'Str',
        !            66:   lazy => 1,
        !            67:   builder => '_build_stub',
        !            68: );
        !            69: 
        !            70: sub _build_stub {
        !            71:   my $self = shift;
        !            72: 
        !            73:   my $date = $self->date;
        !            74:   my $name = $self->name;
        !            75: 
        !            76:   my $reduced = "-reduced" if $self->reduced;
        !            77: 
        !            78:   my $stub = $date . "-" . $name . $reduced;
        !            79: 
        !            80:   $stub =~ tr/a-zA-Z0-9_-/@/c;
        !            81:   return $stub;
        !            82: }
        !            83: 
        !            84: sub add {
        !            85:   my $self = shift;
        !            86:   push @{$self->rows}, row->new(@_);
        !            87: }
        !            88: 
        !            89: sub reduce {
        !            90:   my $self = shift;
        !            91: 
        !            92:   return $self if $self->reduced;
        !            93: 
        !            94:   return results->new(
        !            95:     name => $self->name,
        !            96:     date => $self->date,
        !            97:     reduced => 1,
        !            98:     rows => [
        !            99:       map { $_->reduce } @{$self->rows}
        !           100:     ],
        !           101:   );
        !           102: }
        !           103: 
        !           104: sub dump {
        !           105:   my $self = shift;
        !           106:   my $fn = $self->stub . ".csv";
        !           107: 
        !           108:   open my $CSV, ">", $fn;
        !           109:   map {
        !           110:     $_->dump($CSV);
        !           111:     } @{$self->rows};
        !           112: 
        !           113:   close $CSV;
        !           114:   return $fn;
        !           115: }
        !           116: 
        !           117: sub draw {
        !           118:   my $self = shift;
        !           119: 
        !           120:   my $csv = $self->dump();
        !           121:   my $svg = $self->stub . ".svg";
        !           122: 
        !           123:   my $title = $self->name;
        !           124:   $title =~ s/_/ /g;
        !           125: 
        !           126:   open PLOT, "|-", "gnuplot -p";
        !           127:   print PLOT "set terminal svg;\n";
        !           128:   print PLOT "set output '$svg';\n";
        !           129:   print PLOT "set title '$title';\n";
        !           130:   print PLOT "set datafile separator ',';\n";
        !           131:   print PLOT "set jitter over 0.3 spread 0.3;\n";
        !           132:   print PLOT "plot '$csv' using 1:2 title 'gen', '$csv' using 1:3 title 'temp', '$csv' using 1:4 title 'update', '$csv' using 1:5 title 'withdraw';\n";
        !           133:   close PLOT;
        !           134: }
        !           135: 
        !           136: package main;
        !           137: 
        !           138: my %results;
        !           139: my @done;
        !           140: 
        !           141: while (<>) {
        !           142:   if (m/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*?Perf (.+) starting$/) {
        !           143:     my $date = $1;
        !           144:     my $name = $2;
        !           145:     die "Garbled input data" if exists $results{$name};
        !           146:     $results{$name} = results->new(name => $name, date => $date);
        !           147:     next;
        !           148:   }
        !           149: 
        !           150:   if (m/Perf (.+) done with exp=(\d+)$/) {
        !           151:     my $name = $1;
        !           152:     die "Garbled input data" unless exists $results{$name};
        !           153:     push @done, $results{$name};
        !           154:     delete $results{$name};
        !           155:     next;
        !           156:   }
        !           157: 
        !           158:   my ($name, $exp, $gen, $temp, $update, $withdraw) = m/Perf (.+) exp=(\d+) times: gen=(\d+) temp=(\d+) update=(\d+) withdraw=(\d+)$/ or next;
        !           159: 
        !           160:   exists $results{$name} or die "Garbled input data";
        !           161: 
        !           162:   $results{$name}->add(exp => $exp, gen => $gen, temp => $temp, update => $update, withdraw => $withdraw);
        !           163: }
        !           164: 
        !           165: scalar %results and die "Incomplete input data";
        !           166: 
        !           167: foreach my $res (@done) {
        !           168:   $res->reduce->draw();
        !           169: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>