--- /dev/null
+package org.simantics.scl.compiler.compilation;\r
+\r
+import gnu.trove.map.hash.TObjectLongHashMap;\r
+\r
+import java.util.ArrayList;\r
+\r
+public class CompilationTimer {\r
+ private long initialTime, previousTime;\r
+ private ArrayList<TimerEntry> entries = new ArrayList<TimerEntry>();\r
+ private static TObjectLongHashMap<String> GLOBAL_TIMES = new TObjectLongHashMap<String>();\r
+ \r
+ private static class TimerEntry {\r
+ public final String phaseName;\r
+ public final long time;\r
+ public final long cumulativeTime;\r
+ \r
+ public TimerEntry(String phaseName, long time, long cumulativeTime) {\r
+ this.phaseName = phaseName;\r
+ this.time = time;\r
+ this.cumulativeTime = cumulativeTime;\r
+ } \r
+ }\r
+ \r
+ public CompilationTimer() {\r
+ initialTime = previousTime = System.nanoTime();\r
+ }\r
+ \r
+ public void phaseFinished(String phaseName) {\r
+ long time = System.nanoTime();\r
+ entries.add(new TimerEntry(phaseName, time-previousTime, time-initialTime));\r
+ previousTime = time;\r
+ }\r
+ \r
+ public void suspendTimer() {\r
+ long time = System.nanoTime();\r
+ initialTime -= time;\r
+ previousTime -= time;\r
+ }\r
+ \r
+ public void continueTimer() {\r
+ long time = System.nanoTime();\r
+ initialTime += time;\r
+ previousTime += time;\r
+ }\r
+ \r
+ public void report(String moduleName) {\r
+ synchronized(GLOBAL_TIMES) {\r
+ System.out.println(moduleName);\r
+ for(TimerEntry entry : entries) {\r
+ long globalTime = GLOBAL_TIMES.adjustOrPutValue(entry.phaseName, entry.time, entry.time);\r
+ System.out.println(" " + entry.phaseName + " " + entry.time*1e-6 \r
+ + "ms (cumulative: " + entry.cumulativeTime*1e-6 + "ms, global: " + globalTime*1e-6 + ")");\r
+ }\r
+ }\r
+ }\r
+}\r