123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #!/usr/bin/perl
- use strict;
- my $size = 0;
- my $iters = 0;
- my $who = '';
- my $mode = '';
- my %res = ();
- my $offlinebytes = 0;
- my $netsetup = '';
- my %online_s_data = ();
- my %online_kib_data = ();
- my %total_s_data = ();
- my %total_kib_data = ();
- while(<>) {
- if (/Network setup: (.*)/) {
- $netsetup = "$1 ";
- next;
- }
- ($size,$iters) = ($1,$2) if /===== Running oram (\d+) (\d+)/;
- $res{$size} = {} unless defined $res{$size};
- $who = $1 if /===== ([CDE]) output/;
- $mode = $1 if /(Online Time|Offline Time|ETE)/;
- if(/WC\(ms\): (\d+)/) {
- if (defined $res{$size}->{$who.$mode}) {
- print "Redefinition of res{$size}->{$who$mode}\n";
- } else {
- $res{$size}->{$who.$mode} = $1/1000
- }
- }
- if (/Total Offline Band\(bytes\): (\d+)/) {
- $offlinebytes = $1;
- }
- if (/Total Online Band\(bytes\): (\d+)/) {
- # Note that the java code reports bandwidth *per iteration*
- my $onlinebytes = $1;
- my $totbytes = $onlinebytes + $offlinebytes;
- $res{$size}->{'onlbytes'} = 0 unless
- defined $res{$size}->{'onlbytes'};
- $res{$size}->{'totbytes'} = 0 unless
- defined $res{$size}->{'totbytes'};
- $res{$size}->{'onlbytes'} += $onlinebytes;
- $res{$size}->{'totbytes'} += $totbytes;
- }
- if (/===== End /) {
- my $label = "CircuitORAM read $size $netsetup$iters";
- my $online = &max3($res{$size}->{'COnline Time'},
- $res{$size}->{'DOnline Time'},
- $res{$size}->{'EOnline Time'});
- my $total = &max3($res{$size}->{'CETE'},
- $res{$size}->{'DETE'},
- $res{$size}->{'EETE'});
- &accum_data(\%online_s_data, $label, $online);
- &accum_data(\%total_s_data, $label, $total);
- # Note that the java code reports bandwidth *per iteration*
- my $onlinekib = $res{$size}->{'onlbytes'} * $iters / 1024;
- my $totalkib = $res{$size}->{'totbytes'} * $iters / 1024;
- &accum_data(\%online_kib_data, $label, $onlinekib);
- &accum_data(\%total_kib_data, $label, $totalkib);
- undef $res{$size};
- }
- }
- # Convert the data (in the form [n, sum, sum_squares]) to statistics (in
- # the form [mean, variance])
- my %online_s_stats = ();
- my %online_kib_stats = ();
- my %total_s_stats = ();
- my %total_kib_stats = ();
- &statsify(\%online_s_stats, \%online_s_data);
- &statsify(\%online_kib_stats, \%online_kib_data);
- &statsify(\%total_s_stats, \%total_s_data);
- &statsify(\%total_kib_stats, \%total_kib_data);
- # Output the data
- &output_stats(\%online_s_stats, "Onln", "s");
- &output_stats(\%online_kib_stats, "Onln", "KiB");
- &output_stats(\%total_s_stats, "Totl", "s");
- &output_stats(\%total_kib_stats, "Totl", "KiB");
- # Subroutines
- sub max3 {
- my $m = $_[0];
- $m = $_[1] if $_[1] > $m;
- $m = $_[2] if $_[2] > $m;
- $m;
- }
- # Pass:
- # - a reference to a dictionary
- # - the key into that dictionary
- # - the new data point
- # Data is stored in the dictionary as a triple (n, sum, sum_squares)
- sub accum_data {
- my ($dict, $key, $data) = @_;
- $dict->{$key} = [0, 0, 0] unless defined $dict->{$key};
- $dict->{$key}->[0] += 1;
- $dict->{$key}->[1] += $data;
- $dict->{$key}->[2] += ($data * $data);
- }
- # Convert data (in the form [n, sum, sum_squares]) to statistics (in
- # the form [mean, variance])
- sub statsify {
- my ($sdict, $ddict) = @_;
- my $key;
- foreach $key (keys %$ddict) {
- my $data = $ddict->{$key};
- my $n = $data->[0];
- my $sum = $data->[1];
- my $sumsq = $data->[2];
- if ($n == 0) {
- $sdict->{$key} = [undef, undef];
- } elsif ($n == 1) {
- $sdict->{$key} = [$sum, undef];
- } else {
- $sdict->{$key} = [$sum/$n, ($sumsq - ($sum*$sum/$n))/($n-1)];
- }
- }
- }
- # Turn a stat array [mean, variance] into a string to display
- sub statstr {
- my $data = $_[0];
- if (defined $data->[1]) {
- my $mean = $data->[0];
- my $stddev = $data->[1] > 0 ? sqrt($data->[1]) : 0;
- return "$mean ± $stddev";
- } elsif (defined $data->[0]) {
- return $data->[0];
- } else {
- return "none"
- }
- }
- # Output the stats in the given dictionary. Append $phase to the
- # protocol name, and add $units to the end.
- sub output_stats {
- my ($dict, $phase, $units) = @_;
- my $label;
- foreach $label (sort keys %$dict) {
- my $printlabel = $label;
- $printlabel =~ s/CircuitORAM/CircuitORAM$phase/;
- print $printlabel, " ", &statstr($dict->{$label}), " $units\n";
- }
- }
|