]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / compilation / CompilationTimer.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java
new file mode 100644 (file)
index 0000000..9121588
--- /dev/null
@@ -0,0 +1,56 @@
+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