From 8837c226c0636352e6cd39ee8ba439ab1746e3db Mon Sep 17 00:00:00 2001 From: peter Date: Sat, 25 Mar 2017 07:24:18 +0100 Subject: [PATCH] wait until background activity finishes before measuring performance in tests --- .../intellij/testFramework/CpuUsageData.java | 6 ++++++ .../testFramework/PlatformTestUtil.java | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/platform/testFramework/src/com/intellij/testFramework/CpuUsageData.java b/platform/testFramework/src/com/intellij/testFramework/CpuUsageData.java index b26a3439e594..1d58a96f102b 100644 --- a/platform/testFramework/src/com/intellij/testFramework/CpuUsageData.java +++ b/platform/testFramework/src/com/intellij/testFramework/CpuUsageData.java @@ -66,6 +66,12 @@ public class CpuUsageData { return indent + "GC: " + getGcStats() + "\n" + indent + "Threads: " + getThreadStats() + "\n" + indent + "JIT: " + myCompilationTime + "ms"; } + boolean hasAnyActivityBesides(Thread thread) { + return myCompilationTime > 0 || + myThreadTimes.stream().anyMatch(pair -> pair.first > 0 && !pair.second.equals(thread.getName())) || + myGcTimes.stream().anyMatch(pair -> pair.first > 0); + } + @NotNull private static String printLongestNames(List> times) { String stats = StreamEx.of(times) diff --git a/platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java b/platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java index e7c7892839ee..3ae2bfbaec87 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java +++ b/platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java @@ -583,11 +583,16 @@ public class PlatformTestUtil { if (COVERAGE_ENABLED_BUILD) return; Timings.getStatistics(); // warm-up, measure + if (attempts == 1) { + System.gc(); + } + while (true) { attempts--; CpuUsageData data; try { if (setup != null) setup.run(); + waitForAllBackgroundActivityToCalmDown(); data = CpuUsageData.measureCpuUsage(test); } catch (RuntimeException|Error throwable) { @@ -691,12 +696,22 @@ public class PlatformTestUtil { } } + private static void waitForAllBackgroundActivityToCalmDown() { + for (int i = 0; i < 50; i++) { + CpuUsageData data = CpuUsageData.measureCpuUsage(() -> TimeoutUtil.sleep(100)); + if (!data.hasAnyActivityBesides(Thread.currentThread())) { + break; + } + } + } + public static void assertTiming(String message, long expected, @NotNull Runnable actionToMeasure) { assertTiming(message, expected, 4, actionToMeasure); } - public static long measure(@NotNull Runnable actionToMeasure) { + private static long measure(@NotNull Runnable actionToMeasure) { + waitForAllBackgroundActivityToCalmDown(); long start = System.currentTimeMillis(); actionToMeasure.run(); long finish = System.currentTimeMillis();