#!/usr/bin/perl

@rtt = ();
$n = $timo = 0;
$sum = $sumsq = 0;
$min = $max = undef;
$firsttime = $lasttime = undef;

while (<>) {
    $timo++ if (/timeout/);
    next unless (/rtt/);
    chomp;
    split;
    $rtt = ($_[7] - $_[6]) * 1000;
    $firsttime = $_[6] unless(defined $firsttime);
    $lasttime = $_[6];
    push @rtt, $rtt;
    $sum += $rtt;
    $sumsq += $rtt * $rtt;
    $n++;
    if (defined($min)) {
	$min = $rtt if($rtt < $min);
    } else {
	$min = $rtt;
    }
    if (defined($max)) {
	$max = $rtt if ($rtt > $max);
    } else {
	$max = $rtt;
    }
}

print("start time: ", scalar localtime(int $firsttime), "\n");
print("end time: ", scalar localtime(int $lasttime), "\n");
print "# of observations: $n\n";
printf("# of timeouts: $timo (%0.2f%%)\n", $timo / $n);
printf("mean observation interval: %f s\n", ($lasttime - $firsttime) / $n);
print "\nRTT statistics:\n";
printf("minimum: %f ms\n", $min);
printf("maximum: %f ms\n", $max);
printf("arithmetic mean: %f ms\n", $avg = $sum / $n);
printf("variance: %f ms^2\n", $var = $sumsq / $n - $avg * $avg);
printf("standard deviation: %f ms\n", sqrt($var));

@rtt = sort {$a <=> $b} @rtt;

if ($n % 2) {
    $median = $rtt[$n / 2];
} else {
#    printf("median: avg(%f, %f)\n", $rtt[$n / 2 - 1], $rtt[$n / 2]);
    $median = ($rtt[$n / 2 - 1] + $rtt[$n / 2]) / 2;
}
printf("median: %f ms\n", $median);

if ($n > 4) {
    @qtile = ();
    print("quartiles:\n");
    printf("\tfirst: %f ms\n", $qtile[0] = $rtt[$n / 4 - 1]);
    printf("\tsecond: %f ms\n", $qtile[1] = $rtt[$n / 2 - 1]);
    printf("\tthird: %f ms\n", $qtile[2] = $rtt[3 * $n / 4 - 1]);
    printf("\tfourth: %f ms\n", $qtile[3] = $max);
    printf("\trank size: %d obs\n", $n / 4);
    printf("\tinter-quartile range: %f ms\n", $qtile[2] - $qtile[0]);
}

printf("85th %%ile: %f ms\n", $rtt[85 * $n / 100 - 1]);
printf("90th %%ile: %f ms\n", $rtt[90 * $n / 100 - 1]);
printf("95th %%ile: %f ms\n", $rtt[95 * $n / 100 - 1]);
printf("99th %%ile: %f ms\n", $rtt[99 * $n / 100 - 1]);

