package org.wildfly.swarm.bootstrap.performance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author Bob McWhirter
*/
public class Performance {
private static long START_TIME = -1;
static Map<String, Accumulator> ACCUMULATORS = new HashMap<>();
static Stack<ContextualizedEvent> CONTEXT_STACK = new Stack<>();
static List<ContextualizedEvent> ROOT_CONTEXTS = new ArrayList<>();
static AtomicLong TOTAL_MEASURED_TIME = new AtomicLong();
private Performance() {
}
public static void start() {
START_TIME = System.currentTimeMillis();
}
static String formatTime(long ms) {
long s = 0;
long m = 0;
s = ms / 1000;
ms = ms % 1000;
m = s / 60;
s = s % 60;
return String.format("%02d:%02d.%03d", m, s, ms);
}
public static synchronized AutoCloseable time(String description) {
ContextualizedEvent event = null;
if (CONTEXT_STACK.isEmpty()) {
event = new ContextualizedEvent(description);
ROOT_CONTEXTS.add(event);
} else {
event = CONTEXT_STACK.peek().newChild(description);
}
CONTEXT_STACK.push(event);
return event;
}
public static synchronized AutoCloseable accumulate(String description) {
Accumulator accumulator = ACCUMULATORS.get(description);
if (accumulator == null) {
accumulator = new Accumulator(description);
ACCUMULATORS.put(description, accumulator);
}
return accumulator.newChild();
}
public static String dump() {
StringBuilder str = new StringBuilder();
long totalTime = (START_TIME > 0 ? System.currentTimeMillis() - START_TIME : TOTAL_MEASURED_TIME.get());
ROOT_CONTEXTS.forEach(e -> {
e.dump("", totalTime, str);
});
ACCUMULATORS.values().forEach(e -> {
e.dump(totalTime, str);
});
str.append("Total: " + formatTime(totalTime));
return str.toString().trim();
}
}