From 482e0a739a5cf7e2d1dd81fef845be0c65e87568 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 30 Mar 2017 20:35:21 +0200 Subject: [PATCH] try to stabilize performance test timings even more --- .../src/com/intellij/testFramework/CpuTimings.java | 14 ++++++++------ .../intellij/testFramework/PlatformTestUtil.java | 2 +- .../src/com/intellij/testFramework/Timings.java | 7 ++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/platform/testFramework/src/com/intellij/testFramework/CpuTimings.java b/platform/testFramework/src/com/intellij/testFramework/CpuTimings.java index 7e17d05c54dd..022daaa9d880 100644 --- a/platform/testFramework/src/com/intellij/testFramework/CpuTimings.java +++ b/platform/testFramework/src/com/intellij/testFramework/CpuTimings.java @@ -23,7 +23,6 @@ import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; import java.math.BigInteger; -import java.util.Arrays; import java.util.stream.LongStream; /** @@ -33,9 +32,11 @@ public class CpuTimings { final long[] rawData; long average; private final double myStandardDeviation; + private final int attempt; - private CpuTimings(long[] rawData) { + private CpuTimings(long[] rawData, int attempt) { this.rawData = rawData; + this.attempt = attempt; average = ArrayUtil.averageAmongMedians(rawData, 2); myStandardDeviation = standardDeviation(rawData); } @@ -52,14 +53,14 @@ public class CpuTimings { @Override public String toString() { - return "CpuTimings{" + average + ", raw=" + Arrays.toString(rawData) + ", sd=" + myStandardDeviation + '}'; + return average + "[sd=" + myStandardDeviation + ", attempt=" + attempt + "]"; } @SuppressWarnings("UseOfSystemOutOrSystemErr") static CpuTimings calcStableCpuTiming() { int maxIterations = UsefulTestCase.IS_UNDER_TEAMCITY ? 100 : 10; for (int i = 0;; i++) { - CpuTimings timings = calcCpuTiming(20, CpuTimings::addBigIntegers); + CpuTimings timings = calcCpuTiming(20, CpuTimings::addBigIntegers, i); if (timings.myStandardDeviation < 1.8) { return timings; } @@ -71,17 +72,18 @@ public class CpuTimings { System.out.println(i + ": Unstable timings: " + timings+" (getProcessCpuLoad() = " + getProcessCpuLoad()+"; getSystemCpuLoad() = " + getSystemCpuLoad()+")"); } System.gc(); + PlatformTestUtil.waitForAllBackgroundActivityToCalmDown(); } } - private static CpuTimings calcCpuTiming(int iterationCount, Runnable oneIteration) { + private static CpuTimings calcCpuTiming(int iterationCount, Runnable oneIteration, int attempt) { long[] elapsed = new long[iterationCount]; for (int i = 0; i < iterationCount; i++) { long start = System.currentTimeMillis(); oneIteration.run(); elapsed[i] = System.currentTimeMillis() - start; } - return new CpuTimings(elapsed); + return new CpuTimings(elapsed, attempt); } private static void addBigIntegers() { diff --git a/platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java b/platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java index 60de37e321e4..f3f38c733063 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java +++ b/platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java @@ -680,7 +680,7 @@ public class PlatformTestUtil { } } - private static void waitForAllBackgroundActivityToCalmDown() { + static void waitForAllBackgroundActivityToCalmDown() { for (int i = 0; i < 50; i++) { CpuUsageData data = CpuUsageData.measureCpuUsage(() -> TimeoutUtil.sleep(100)); if (!data.hasAnyActivityBesides(Thread.currentThread())) { diff --git a/platform/testFramework/src/com/intellij/testFramework/Timings.java b/platform/testFramework/src/com/intellij/testFramework/Timings.java index 7c4d864a2d5f..c3927ddd2727 100644 --- a/platform/testFramework/src/com/intellij/testFramework/Timings.java +++ b/platform/testFramework/src/com/intellij/testFramework/Timings.java @@ -28,6 +28,7 @@ public class Timings { private static final int IO_PROBES = 42; public static final long CPU_TIMING; + private static final CpuTimings CPU_TIMING_DATA; public static final long IO_TIMING; /** @@ -37,8 +38,8 @@ public class Timings { public static final long REFERENCE_IO_TIMING = 100; static { - CpuTimings timings = CpuTimings.calcStableCpuTiming(); - CPU_TIMING = timings.average; + CPU_TIMING_DATA = CpuTimings.calcStableCpuTiming(); + CPU_TIMING = CPU_TIMING_DATA.average; long start = System.currentTimeMillis(); for (int i = 0; i < IO_PROBES; i++) { @@ -96,7 +97,7 @@ public class Timings { public static String getStatistics() { return - " Timings: CPU=" + CPU_TIMING + " (" + (int)(CPU_TIMING * 1.0 / REFERENCE_CPU_TIMING * 100) + "% of the reference CPU)" + + " Timings: CPU=" + CPU_TIMING_DATA + " (" + (int)(CPU_TIMING * 1.0 / REFERENCE_CPU_TIMING * 100) + "% of the reference CPU)" + ", I/O=" + IO_TIMING + " (" + (int)(IO_TIMING * 1.0 / REFERENCE_IO_TIMING * 100) + "% of the reference IO)" + ", " + Runtime.getRuntime().availableProcessors() + " cores."; }