#!/usr/bin/env python

import sys
from scipy.stats import mannwhitneyu

SIGNIFICANCE_THRESHOLD = 0.0001

a,b = {},{}
for (path, d) in [(sys.argv[1], a), (sys.argv[2], b)]:
    for line in open(path):
        try:
            tokens = line.split()
            if tokens[0] != "Samples:":
                continue
            samples  = tokens[1:-1]
            label    = tokens[-1]
            d[label] = map(float, samples)
        except:
            pass

common = set(a.keys()).intersection(b.keys())

ps = []
for key in common:
    _, p = mannwhitneyu(a[key], b[key])    # Non-parametric t-test.  Doesn't assume normal dist.
    am, bm = min(a[key]), min(b[key])
    ps.append((bm/am, p, key, am, bm))
ps.sort(reverse=True)

def humanize(ns):
    for threshold, suffix in [(1e9, 's'), (1e6, 'ms'), (1e3, 'us'), (1e0, 'ns')]:
        if ns > threshold:
            return "%.3g%s" % (ns/threshold, suffix)

maxlen = max(map(len, common))

# We print only signficant changes in benchmark timing distribution.
bonferroni = SIGNIFICANCE_THRESHOLD / len(ps)  # Adjust for the fact we've run multiple tests.
for ratio, p, key, am, bm in ps:
    if p < bonferroni:
        str_ratio = ('%.2gx' if ratio < 1 else '%.3gx') % ratio
        print '%*s\t%6s -> %6s\t%s' % (maxlen, key, humanize(am), humanize(bm), str_ratio)
