X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fcompilation%2FCompilationTimer.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fcompilation%2FCompilationTimer.java;h=91215886255e02c05d25f7b43835afa2cdb4c29f;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git 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 index 000000000..912158862 --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/CompilationTimer.java @@ -0,0 +1,56 @@ +package org.simantics.scl.compiler.compilation; + +import gnu.trove.map.hash.TObjectLongHashMap; + +import java.util.ArrayList; + +public class CompilationTimer { + private long initialTime, previousTime; + private ArrayList entries = new ArrayList(); + private static TObjectLongHashMap GLOBAL_TIMES = new TObjectLongHashMap(); + + private static class TimerEntry { + public final String phaseName; + public final long time; + public final long cumulativeTime; + + public TimerEntry(String phaseName, long time, long cumulativeTime) { + this.phaseName = phaseName; + this.time = time; + this.cumulativeTime = cumulativeTime; + } + } + + public CompilationTimer() { + initialTime = previousTime = System.nanoTime(); + } + + public void phaseFinished(String phaseName) { + long time = System.nanoTime(); + entries.add(new TimerEntry(phaseName, time-previousTime, time-initialTime)); + previousTime = time; + } + + public void suspendTimer() { + long time = System.nanoTime(); + initialTime -= time; + previousTime -= time; + } + + public void continueTimer() { + long time = System.nanoTime(); + initialTime += time; + previousTime += time; + } + + public void report(String moduleName) { + synchronized(GLOBAL_TIMES) { + System.out.println(moduleName); + for(TimerEntry entry : entries) { + long globalTime = GLOBAL_TIMES.adjustOrPutValue(entry.phaseName, entry.time, entry.time); + System.out.println(" " + entry.phaseName + " " + entry.time*1e-6 + + "ms (cumulative: " + entry.cumulativeTime*1e-6 + "ms, global: " + globalTime*1e-6 + ")"); + } + } + } +}