lean4-htt/tests/playground/report.py
2019-05-15 19:39:55 +02:00

64 lines
2.2 KiB
Python
Executable file

#!/usr/bin/env python3
import ast
import json
import os
import re
import sys
def read(bench, cat):
result = json.load(open(f"bench/{bench}{cat}.bench", 'r'))[2][0]['reportAnalysis']
mean = result['anMean']['estPoint']
stddev = result['anStdDev']['estPoint']
return (mean, stddev)
def pp_bench(bench, cat, norm):
(mean, stddev) = read(bench, cat)
return f"{mean/norm:.3f} ± {stddev/norm:.3f}"
def pp_gc_hs(bench, cat, norm):
info = dict(ast.literal_eval(open(f"bench/{bench}{cat}.bench", 'r').read().strip()))
gc_part = float(info['GC_cpu_seconds']) / float(info['total_cpu_seconds'])
return f"{gc_part:.0%}"
def pp_gc_ml(bench, cat, norm):
events = open(f"bench/{bench}{cat}.bench", 'r').readlines()
if not events:
return "-"
wall_secs = float(events[-1])
gc_nanos = 0
for event in events[::-1]:
data = event.split()
# see also https://gitlab.com/gasche/gc-latency-experiment/blob/master/parse_ocaml_log.ml
if len(data) == 4 and data[0] == '@@' and data[3] == 'dispatch':
gc_nanos += int(data[2]) - int(data[1])
return f"{gc_nanos*1e-9/wall_secs:.0%}"
def pp_perf(bench, cat, norm):
stat = open(f"bench/{bench}{cat}.bench", 'r').read()
#misses_percent = float(re.search("([0-9.]+) % of all cache refs", stat)[1]) / 100
misses = int(re.search("([0-9,]+)\s+cache-misses", stat)[1].replace(',', ''))
secs = float(re.search("([0-9.]+) seconds time elapsed", stat)[1])
return f"{misses*1e-6/secs:.3f}"
CATBAG = {
'.lean': ("Lean", pp_bench),
'.gcc.lean': ("Lean+GCC9", pp_bench),
'.lean.perf': ("cache misses (1M/s)", pp_perf),
'.hs': ("GHC", pp_bench),
'.gc.hs': ("%GC", pp_gc_hs),
'.hs.perf': ("cache misses", pp_perf),
'.llvm.hs': ("GHC -fllvm", pp_bench),
'.ml': ("OCaml", pp_bench),
'.gc.ml': ("%GC", pp_gc_ml),
'.ml.perf': ("cache misses", pp_perf),
'.flambda.ml': ("OCaml+Flambda", pp_bench),
}
benches = os.environ['BENCHES'].split(':')
cats = os.environ['CATS'].split(':')
print(";".join(["Benchmark"] + [CATBAG[cat][0] for cat in cats]))
for bench in benches:
norm = read(bench, '.lean')[0]
print(";".join([bench] + [CATBAG[cat][1](bench, cat, norm) for cat in cats]))