summaryrefslogtreecommitdiffstats
path: root/js/src/tests/compare_bench.py
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/compare_bench.py')
-rw-r--r--js/src/tests/compare_bench.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/js/src/tests/compare_bench.py b/js/src/tests/compare_bench.py
new file mode 100644
index 000000000..cfe9508cd
--- /dev/null
+++ b/js/src/tests/compare_bench.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python2.4
+"""usage: %progname candidate_path baseline_path
+"""
+
+from __future__ import print_function
+
+import json
+import optparse
+from operator import itemgetter
+
+
+def avg(seq):
+ return sum(seq) / len(seq)
+
+
+def compare(current, baseline):
+ percent_speedups = []
+ for key, current_result in current.iteritems():
+ try:
+ baseline_result = baseline[key]
+ except KeyError:
+ print(key, 'missing from baseline')
+ continue
+ val_getter = itemgetter('average_ms', 'stddev_ms')
+ base_avg, base_stddev = val_getter(baseline_result)
+ current_avg, current_stddev = val_getter(current_result)
+ t_best = current_avg - current_stddev
+ t_worst = current_avg + current_stddev
+ base_t_best = base_avg - base_stddev
+ base_t_worst = base_avg + base_stddev
+ if t_worst < base_t_best:
+ # Worst takes less time (better) than baseline's best.
+ speedup = -((t_worst - base_t_best) / base_t_best) * 100
+ result = 'faster: {:6.2f}ms < baseline {:6.2f}ms ({:+6.2f}%)'.format(
+ t_worst, base_t_best, speedup)
+ percent_speedups.append(speedup)
+ elif t_best > base_t_worst:
+ # Best takes more time (worse) than baseline's worst.
+ slowdown = -((t_best - base_t_worst) / base_t_worst) * 100
+ result = 'SLOWER: {:6.2f}ms > baseline {:6.2f}ms ({:+6.2f}%) '.format(
+ t_best, base_t_worst, slowdown)
+ percent_speedups.append(slowdown)
+ else:
+ result = 'Meh.'
+ print('{:30s}: {}'.format(key, result))
+ if percent_speedups:
+ print('Average speedup: {:.2f}%'.format(avg(percent_speedups)))
+
+
+def compare_immediate(current_map, baseline_path):
+ baseline_file = open(baseline_path)
+ baseline_map = json.load(baseline_file)
+ baseline_file.close()
+ compare(current_map, baseline_map)
+
+
+def main(candidate_path, baseline_path):
+ candidate_file, baseline_file = open(candidate_path), open(baseline_path)
+ candidate = json.load(candidate_file)
+ baseline = json.load(baseline_file)
+ compare(candidate, baseline)
+ candidate_file.close()
+ baseline_file.close()
+
+
+if __name__ == '__main__':
+ parser = optparse.OptionParser(usage=__doc__.strip())
+ options, args = parser.parse_args()
+ try:
+ candidate_path = args.pop(0)
+ except IndexError:
+ parser.error('A JSON filepath to compare against baseline is required')
+ try:
+ baseline_path = args.pop(0)
+ except IndexError:
+ parser.error('A JSON filepath for baseline is required')
+ main(candidate_path, baseline_path)