sclass MultiBencher { settable Runnable action; settable double seconds = 10; settable double interval = 0.001; double elapsedSeconds; new L benchers; *() {} *(Runnable *action) {} run { ensureCapacity(benchers, iceilRatio(seconds, interval)+2); long start = nanoTime(), endTime = lround(start+secondsToNanos(seconds)); while (nanoTime() < endTime) { var bencher = addAndReturn(benchers, new BenchForNSeconds(interval, action)); bencher.run(); } } long startTime() { ret empty(benchers) ? 0 : first(benchers).startTime; } toString { ret lines(mapWithIndex(benchers, (i, b) -> "Run " + (i+1) + "/" + l(benchers) + " (T+" + n2(lround(nanosToMilliseconds(b.startTime-startTime()))) + " ms): " + b)); } }