From bee8555d68e196b51f2e193cb1ec556476efe746 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Wed, 10 May 2017 15:57:37 +0300 Subject: [PATCH] switched to nanoTime() as offering more monotonicity guarantees and made recoverable from crash --- .../src/com/intellij/util/PausesStat.java | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/platform/util/src/com/intellij/util/PausesStat.java b/platform/util/src/com/intellij/util/PausesStat.java index 84047b10c948..cd6a0ca16f53 100644 --- a/platform/util/src/com/intellij/util/PausesStat.java +++ b/platform/util/src/com/intellij/util/PausesStat.java @@ -19,6 +19,7 @@ import com.intellij.util.containers.UnsignedShortArrayList; import org.jetbrains.annotations.NotNull; import java.awt.*; +import java.util.concurrent.TimeUnit; public class PausesStat { private static final int N_MAX = 100000; @@ -54,7 +55,7 @@ public class PausesStat { assertEdt(); assert !started; assert startTimeStamp == 0 : startTimeStamp; - startTimeStamp = System.currentTimeMillis(); + startTimeStamp = System.nanoTime(); started = true; startDescription = description; } @@ -66,29 +67,30 @@ public class PausesStat { public void finished(@NotNull String description) { assertEdt(); assert started; - long finishStamp = System.currentTimeMillis(); + started = false; + long finishStamp = System.nanoTime(); long startTimeStamp = this.startTimeStamp; - int duration = (int)(finishStamp - startTimeStamp); - if (finishStamp < startTimeStamp || duration < 0) { + int durationMs = (int)TimeUnit.NANOSECONDS.toMillis(finishStamp - startTimeStamp); + this.startTimeStamp = 0; + if (finishStamp < startTimeStamp || durationMs < 0) { int lastPause = durations.size() == N_MAX ? durations.get((indexToOverwrite -1 + N_MAX) % N_MAX) : durations.get(durations.size()-1); - throw new IllegalStateException("startTimeStamp: " + startTimeStamp - + "; finishStamp: " + finishStamp - + "; duration: " + duration + throw new IllegalStateException( "\n"+ + "startTimeStamp: " + startTimeStamp +"\n" + + "; finishStamp: " + finishStamp + + "; durationMs: " + durationMs + "; lastPause: " + lastPause + "\n; description: " + description + (description.equals(startDescription) ? "" : "\n; startDescription: " + startDescription) ); } - started = false; - this.startTimeStamp = 0; - duration = Math.min(duration, Short.MAX_VALUE); - if (duration > maxDuration) { - maxDuration = duration; + durationMs = Math.min(durationMs, Short.MAX_VALUE); + if (durationMs > maxDuration) { + maxDuration = durationMs; maxDurationDescription = description; } totalNumberRecorded++; - register(duration); + register(durationMs); } public String statistics() {