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>