From 7948fd1a34e5da97b8ef09aae1597d64f4f9e0d6 Mon Sep 17 00:00:00 2001 From: Stefan Oehme Date: Sat, 1 Apr 2017 23:22:49 +0200 Subject: [PATCH] Warm up profiler plugin code The build scan and chrome trace plugins should be warmed up to minimize their effect on the final measurement. --- .../gradle/profiler/GeneratedInitScript.java | 17 +++++++++---- .../gradle/profiler/PidInstrumentation.java | 8 +------ .../bs/BuildScanGradleArgsCalculator.java | 23 ------------------ .../profiler/bs/BuildScanInitScript.java | 10 ++------ .../gradle/profiler/bs/BuildScanProfiler.java | 24 +++++++++++++++++-- .../ct/ChromeTraceGradleArgsCalculator.java | 23 ------------------ .../profiler/ct/ChromeTraceInitScript.java | 15 ++++++------ .../profiler/ct/ChromeTraceProfiler.java | 18 +++++++++++++- .../profiler/ProfilerIntegrationTest.groovy | 19 ++++++++++++++- .../org/gradle/trace/GradleTracingPlugin.java | 12 ++++++---- 10 files changed, 87 insertions(+), 82 deletions(-) delete mode 100644 src/main/java/org/gradle/profiler/bs/BuildScanGradleArgsCalculator.java delete mode 100644 src/main/java/org/gradle/profiler/ct/ChromeTraceGradleArgsCalculator.java diff --git a/src/main/java/org/gradle/profiler/GeneratedInitScript.java b/src/main/java/org/gradle/profiler/GeneratedInitScript.java index 06f278dd..57ac5641 100644 --- a/src/main/java/org/gradle/profiler/GeneratedInitScript.java +++ b/src/main/java/org/gradle/profiler/GeneratedInitScript.java @@ -25,20 +25,27 @@ public abstract class GeneratedInitScript { private final File initScript; - public GeneratedInitScript() throws IOException { - initScript = File.createTempFile("gradleProfiler" + getClass().getSimpleName(), ".gradle"); + public GeneratedInitScript() { + try { + initScript = File.createTempFile("gradleProfiler" + getClass().getSimpleName(), ".gradle"); + } catch (IOException e) { + throw new RuntimeException(e); + } initScript.deleteOnExit(); } - public abstract void writeContents(PrintWriter writer); + protected abstract void writeContents(PrintWriter writer); - protected void generateInitScript() throws IOException { + private void generateInitScript(){ try (PrintWriter writer = new PrintWriter(new FileWriter(initScript))) { writeContents(writer); + } catch (IOException e) { + throw new RuntimeException(e); } } - public List getArgs() { + public final List getArgs() { + generateInitScript(); return Arrays.asList("-I", initScript.getAbsolutePath()); } } diff --git a/src/main/java/org/gradle/profiler/PidInstrumentation.java b/src/main/java/org/gradle/profiler/PidInstrumentation.java index 19ed7be0..a0fa6060 100644 --- a/src/main/java/org/gradle/profiler/PidInstrumentation.java +++ b/src/main/java/org/gradle/profiler/PidInstrumentation.java @@ -1,19 +1,13 @@ package org.gradle.profiler; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.PrintWriter; +import java.io.*; class PidInstrumentation extends GeneratedInitScript { private final File pidFile; PidInstrumentation() throws IOException { - super(); pidFile = File.createTempFile("gradle-profiler", "pid"); pidFile.deleteOnExit(); - generateInitScript(); } @Override diff --git a/src/main/java/org/gradle/profiler/bs/BuildScanGradleArgsCalculator.java b/src/main/java/org/gradle/profiler/bs/BuildScanGradleArgsCalculator.java deleted file mode 100644 index 5d9d35cc..00000000 --- a/src/main/java/org/gradle/profiler/bs/BuildScanGradleArgsCalculator.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.gradle.profiler.bs; - -import org.gradle.profiler.GradleArgsCalculator; - -import java.io.IOException; -import java.util.List; - -public class BuildScanGradleArgsCalculator extends GradleArgsCalculator { - private final String buildScanVersion; - - public BuildScanGradleArgsCalculator(String buildScanVersion) { - this.buildScanVersion = buildScanVersion; - } - - @Override - public void calculateGradleArgs(List gradleArgs) { - try { - gradleArgs.addAll(new BuildScanInitScript(buildScanVersion).getArgs()); - } catch (IOException e) { - throw new RuntimeException("Could not generate init script.", e); - } - } -} diff --git a/src/main/java/org/gradle/profiler/bs/BuildScanInitScript.java b/src/main/java/org/gradle/profiler/bs/BuildScanInitScript.java index 142d080d..45493bce 100644 --- a/src/main/java/org/gradle/profiler/bs/BuildScanInitScript.java +++ b/src/main/java/org/gradle/profiler/bs/BuildScanInitScript.java @@ -17,19 +17,14 @@ import org.gradle.profiler.GeneratedInitScript; -import java.io.IOException; import java.io.PrintWriter; public class BuildScanInitScript extends GeneratedInitScript { - public final static String VERSION = "1.6"; private final String version; - public BuildScanInitScript(String version) throws IOException { - super(); - this.version = version == null ? VERSION : version; - generateInitScript(); - System.out.println("Using build scan profiler version " + this.version); + public BuildScanInitScript(String version) { + this.version = version; } @Override @@ -50,7 +45,6 @@ public void writeContents(final PrintWriter writer) { writer.write(" buildScan {\n"); writer.write(" licenseAgreementUrl = 'https://gradle.com/terms-of-service'\n"); writer.write(" licenseAgree = 'yes'\n"); - writer.write(" publishAlways()\n"); writer.write(" }\n"); writer.write("}\n"); } diff --git a/src/main/java/org/gradle/profiler/bs/BuildScanProfiler.java b/src/main/java/org/gradle/profiler/bs/BuildScanProfiler.java index bf0a1d36..b3a021cf 100644 --- a/src/main/java/org/gradle/profiler/bs/BuildScanProfiler.java +++ b/src/main/java/org/gradle/profiler/bs/BuildScanProfiler.java @@ -14,6 +14,9 @@ import java.util.stream.Stream; public class BuildScanProfiler extends Profiler { + + private final static String VERSION = "1.6"; + private final String buildScanVersion; public BuildScanProfiler() { @@ -21,7 +24,8 @@ public BuildScanProfiler() { } private BuildScanProfiler(String buildScanVersion) { - this.buildScanVersion = buildScanVersion; + this.buildScanVersion = buildScanVersion == null ? VERSION : buildScanVersion; + ; } @Override @@ -57,9 +61,25 @@ public List summarizeResultFile(File resultFile) { return buildScanURLs; } + @Override + public GradleArgsCalculator newGradleArgsCalculator(ScenarioSettings settings) { + return new GradleArgsCalculator() { + @Override + public void calculateGradleArgs(List gradleArgs) { + gradleArgs.addAll(new BuildScanInitScript(buildScanVersion).getArgs()); + } + }; + } + @Override public GradleArgsCalculator newInstrumentedBuildsGradleArgsCalculator(ScenarioSettings settings) { - return new BuildScanGradleArgsCalculator(buildScanVersion); + return new GradleArgsCalculator() { + @Override + public void calculateGradleArgs(List gradleArgs) { + System.out.println("Using build scan profiler version " + buildScanVersion); + gradleArgs.add("-Dscan"); + } + }; } @Override diff --git a/src/main/java/org/gradle/profiler/ct/ChromeTraceGradleArgsCalculator.java b/src/main/java/org/gradle/profiler/ct/ChromeTraceGradleArgsCalculator.java deleted file mode 100644 index 50389d12..00000000 --- a/src/main/java/org/gradle/profiler/ct/ChromeTraceGradleArgsCalculator.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.gradle.profiler.ct; - -import org.gradle.profiler.GradleArgsCalculator; -import org.gradle.profiler.ScenarioSettings; - -import java.util.List; - -public class ChromeTraceGradleArgsCalculator extends GradleArgsCalculator { - private final ScenarioSettings settings; - - public ChromeTraceGradleArgsCalculator(ScenarioSettings settings) { - this.settings = settings; - } - - @Override - public void calculateGradleArgs(List gradleArgs) { - try { - gradleArgs.addAll(new ChromeTraceInitScript(settings.getScenario().getOutputDir()).getArgs()); - } catch (Exception e) { - throw new RuntimeException("Could not generate init script.", e); - } - } -} diff --git a/src/main/java/org/gradle/profiler/ct/ChromeTraceInitScript.java b/src/main/java/org/gradle/profiler/ct/ChromeTraceInitScript.java index a51185fb..2a6f7034 100644 --- a/src/main/java/org/gradle/profiler/ct/ChromeTraceInitScript.java +++ b/src/main/java/org/gradle/profiler/ct/ChromeTraceInitScript.java @@ -29,12 +29,14 @@ public class ChromeTraceInitScript extends GeneratedInitScript { private final File chromeTracePlugin; private final File traceFile; - public ChromeTraceInitScript(File outputDir) throws IOException { - super(); - chromeTracePlugin = File.createTempFile("chrome-trace", ".jar"); + public ChromeTraceInitScript(File outputDir) { + try { + chromeTracePlugin = File.createTempFile("chrome-trace", "jar"); + } catch (IOException e) { + throw new RuntimeException(e); + } + chromeTracePlugin.deleteOnExit(); traceFile = new File(outputDir, "chrome-trace.html"); - unpackChromeTracePlugin(); - generateInitScript(); } private void unpackChromeTracePlugin() { @@ -48,6 +50,7 @@ private void unpackChromeTracePlugin() { @Override public void writeContents(final PrintWriter writer) { + unpackChromeTracePlugin(); writer.write("initscript {\n"); writer.write(" dependencies {\n"); writer.write(" classpath files(\"" + chromeTracePlugin.getAbsolutePath() + "\")\n"); @@ -57,6 +60,4 @@ public void writeContents(final PrintWriter writer) { writer.write("rootProject { ext.chromeTraceFile = new File(\"" + traceFile.getAbsolutePath() + "\") }\n"); writer.write("apply plugin: org.gradle.trace.GradleTracingPlugin\n"); } - - } diff --git a/src/main/java/org/gradle/profiler/ct/ChromeTraceProfiler.java b/src/main/java/org/gradle/profiler/ct/ChromeTraceProfiler.java index 1077ffcc..4e0f5e2c 100644 --- a/src/main/java/org/gradle/profiler/ct/ChromeTraceProfiler.java +++ b/src/main/java/org/gradle/profiler/ct/ChromeTraceProfiler.java @@ -22,8 +22,24 @@ public List summarizeResultFile(File resultFile) { return null; } + @Override + public GradleArgsCalculator newGradleArgsCalculator(ScenarioSettings settings) { + return new GradleArgsCalculator() { + @Override + public void calculateGradleArgs(List gradleArgs) { + gradleArgs.addAll(new ChromeTraceInitScript(settings.getScenario().getOutputDir()).getArgs()); + } + }; + } + @Override public GradleArgsCalculator newInstrumentedBuildsGradleArgsCalculator(ScenarioSettings settings) { - return new ChromeTraceGradleArgsCalculator(settings); + return new GradleArgsCalculator() { + @Override + public void calculateGradleArgs(List gradleArgs) { + gradleArgs.add("-Dtrace"); + } + }; } + } diff --git a/src/test/groovy/org/gradle/profiler/ProfilerIntegrationTest.groovy b/src/test/groovy/org/gradle/profiler/ProfilerIntegrationTest.groovy index 18bfde41..4d775668 100644 --- a/src/test/groovy/org/gradle/profiler/ProfilerIntegrationTest.groovy +++ b/src/test/groovy/org/gradle/profiler/ProfilerIntegrationTest.groovy @@ -1,6 +1,7 @@ package org.gradle.profiler import org.gradle.profiler.bs.BuildScanInitScript +import org.gradle.profiler.bs.BuildScanProfiler import org.gradle.profiler.jprofiler.JProfiler import org.gradle.profiler.yjp.YourKit import org.junit.Rule @@ -366,7 +367,7 @@ println "").size() == 4 logFile.grep("").size() == 3 - assertBuildScanPublished(BuildScanInitScript.VERSION) + assertBuildScanPublished(BuildScanProfiler.VERSION) } @Requires({ new File(JProfiler.getDefaultHomeDir()).exists() }) @@ -385,6 +386,22 @@ apply plugin: BasePlugin outputDir.listFiles().find { it.name.matches("default.jps") } } + @Requires({ new File(JProfiler.getDefaultHomeDir()).exists() }) + def "profiles --no-daemon build using JProfiler"() { + given: + buildFile.text = """ +apply plugin: BasePlugin +""" + + when: + new Main(). + run("--project-dir", projectDir.absolutePath, "--output-dir", outputDir.absolutePath, "--gradle-version", gradleVersion, "--profile", "jprofiler", + "--no-daemon", "assemble") + + then: + outputDir.listFiles().find { it.name.matches("default.jps") } + } + @Requires({ new File(JProfiler.getDefaultHomeDir()).exists() }) def "profiles build using JProfiler with all supported options"() { given: diff --git a/subprojects/chrome-trace/src/main/java/org/gradle/trace/GradleTracingPlugin.java b/subprojects/chrome-trace/src/main/java/org/gradle/trace/GradleTracingPlugin.java index 41283b2a..5792503e 100644 --- a/subprojects/chrome-trace/src/main/java/org/gradle/trace/GradleTracingPlugin.java +++ b/subprojects/chrome-trace/src/main/java/org/gradle/trace/GradleTracingPlugin.java @@ -181,13 +181,15 @@ public void buildFinished(BuildResult result) { start(PHASE_BUILD, CATEGORY_PHASE, toNanoTime(buildRequestMetaData.getBuildTimeClock().getStartTime())); finish(PHASE_BUILD, System.nanoTime(), new HashMap<>()); - File traceFile = getTraceFile(); + if (System.getProperty("trace") != null) { + File traceFile = getTraceFile(); - copyResourceToFile("/trace-header.html", traceFile, false); - writeEvents(traceFile); - copyResourceToFile("/trace-footer.html", traceFile, true); + copyResourceToFile("/trace-header.html", traceFile, false); + writeEvents(traceFile); + copyResourceToFile("/trace-footer.html", traceFile, true); - result.getGradle().getRootProject().getLogger().lifecycle("Trace written to file://" + traceFile.getAbsolutePath()); + result.getGradle().getRootProject().getLogger().lifecycle("Trace written to file://" + traceFile.getAbsolutePath()); + } } private void copyResourceToFile(String resourcePath, File traceFile, boolean append) {