sclass FunctionTimings {
Map data = syncMap();
void time(A function, Runnable r) {
if (r == null) ret;
Average avg = syncMapGetOrCreate(data, function, -> new Average);
long time = nanoTime();
try {
r.run();
} finally {
time = nanoTime()-time;
avg.add(time);
}
}
Map get() { ret cloneMap(data); }
void reset aka clear() { data.clear(); }
// as multi-line string, sorted alphabetically
S render() {
ret lines(ciSorted(map(functionTimings!, (f, avg) ->
firstToUpper(f) + ": " + n2(iround(nsToMicroseconds(avg!))) + " " + microSymbol() + "s (" + n2(iround(avg.n())) + ")")));
}
}