From 6164b7b2ee8066c5f047f6ea49c477b6f9e3aba6 Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Sat, 26 Aug 2017 17:10:18 -0700 Subject: [PATCH] Move jmh benchmarks to their respective modules The benchmarks should be close to the code they're benchmarking, like we do with tests. This includes a bugfix to SerializingExecutorBenchmark to let it run. The io.grpc.benchmarks.netty benchmarks in benchmarks/ depend on ByteBufOutputMarshaller from benchmarks's main, so they were not moved. --- benchmarks/build.gradle | 19 +++---------------- build.gradle | 19 +++++++++++++++++-- .../java/io/grpc}/AttachDetachBenchmark.java | 3 +-- .../src/jmh/java/io/grpc}/ReadBenchmark.java | 3 +-- .../src/jmh/java/io/grpc}/WriteBenchmark.java | 3 +-- core/build.gradle | 5 +++++ .../java/io/grpc}/CallOptionsBenchmark.java | 3 +-- .../grpc/DecompressorRegistryBenchmark.java | 0 .../src/jmh/java/io/grpc/StatusBenchmark.java | 0 .../SerializingExecutorBenchmark.java | 5 +++-- .../internal/StatsTraceContextBenchmark.java | 0 netty/build.gradle | 6 ++++++ .../grpc/netty/InboundHeadersBenchmark.java | 0 .../grpc/netty/MethodDescriptorBenchmark.java | 0 .../grpc/netty/OutboundHeadersBenchmark.java | 0 15 files changed, 38 insertions(+), 28 deletions(-) rename {benchmarks/src/jmh/java/io/grpc/context => context/src/jmh/java/io/grpc}/AttachDetachBenchmark.java (96%) rename {benchmarks/src/jmh/java/io/grpc/context => context/src/jmh/java/io/grpc}/ReadBenchmark.java (98%) rename {benchmarks/src/jmh/java/io/grpc/context => context/src/jmh/java/io/grpc}/WriteBenchmark.java (97%) rename {benchmarks/src/jmh/java/io/grpc/benchmarks => core/src/jmh/java/io/grpc}/CallOptionsBenchmark.java (98%) rename {benchmarks => core}/src/jmh/java/io/grpc/DecompressorRegistryBenchmark.java (100%) rename {benchmarks => core}/src/jmh/java/io/grpc/StatusBenchmark.java (100%) rename {benchmarks => core}/src/jmh/java/io/grpc/internal/SerializingExecutorBenchmark.java (96%) rename {benchmarks => core}/src/jmh/java/io/grpc/internal/StatsTraceContextBenchmark.java (100%) rename {benchmarks => netty}/src/jmh/java/io/grpc/netty/InboundHeadersBenchmark.java (100%) rename {benchmarks => netty}/src/jmh/java/io/grpc/netty/MethodDescriptorBenchmark.java (100%) rename {benchmarks => netty}/src/jmh/java/io/grpc/netty/OutboundHeadersBenchmark.java (100%) diff --git a/benchmarks/build.gradle b/benchmarks/build.gradle index 7794375ad4..221dd95ade 100644 --- a/benchmarks/build.gradle +++ b/benchmarks/build.gradle @@ -1,20 +1,12 @@ buildscript { repositories { mavenCentral() - maven { - url "https://plugins.gradle.org/m2/" - } } dependencies { - classpath libraries.math classpath libraries.protobuf_plugin } } -plugins { - id "me.champeau.gradle.jmh" version "0.4.4" -} - apply plugin: 'application' description = "grpc Benchmarks" @@ -23,11 +15,10 @@ startScripts.enabled = false run.enabled = false jmh { - jmhVersion = '1.19' - warmupIterations = 10 - iterations = 10 - fork = 1 jvmArgs = "-server -Xms2g -Xmx2g" + // Workaround + // https://github.com/melix/jmh-gradle-plugin/issues/97#issuecomment-316664026 + includeTests = true } dependencies { @@ -50,10 +41,6 @@ compileJava { options.compilerArgs += ["-Xep:JavaLangClash:OFF"] } -compileJmhJava { - options.compilerArgs = compileJava.options.compilerArgs -} - configureProtoCompilation() def vmArgs = [ diff --git a/build.gradle b/build.gradle index 6a2618e984..c1f5c9dcd1 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ buildscript { classpath 'com.google.gradle:osdetector-gradle-plugin:1.4.0' classpath 'ru.vyarus:gradle-animalsniffer-plugin:1.4.0' classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.11' + classpath "me.champeau.gradle:jmh-gradle-plugin:0.4.4" } } @@ -21,6 +22,7 @@ subprojects { apply plugin: "signing" apply plugin: "jacoco" + apply plugin: "me.champeau.gradle.jmh" apply plugin: "com.google.osdetector" // The plugin only has an effect if a signature is specified apply plugin: "ru.vyarus.animalsniffer" @@ -57,7 +59,7 @@ subprojects { mavenLocal() } - [compileJava, compileTestJava].each() { + [compileJava, compileTestJava, compileJmhJava].each() { it.options.compilerArgs += ["-Xlint:all", "-Xlint:-options", "-Xlint:-path"] it.options.encoding = "UTF-8" if (rootProject.hasProperty('failOnWarnings') && rootProject.failOnWarnings.toBoolean()) { @@ -165,7 +167,7 @@ subprojects { } } - [compileJava, compileTestJava].each() { + [compileJava, compileTestJava, compileJmhJava].each() { // Protobuf-generated code produces some warnings. // https://github.com/google/protobuf/issues/2718 it.options.compilerArgs += ["-Xlint:-cast", "-Xep:MissingOverride:OFF", @@ -227,6 +229,9 @@ subprojects { // Configuration for modules that use Jetty ALPN agent alpnagent libraries.jetty_alpn_agent + + jmh 'org.openjdk.jmh:jmh-core:1.19', + 'org.openjdk.jmh:jmh-generator-bytecode:1.19' } signing { @@ -261,6 +266,16 @@ subprojects { source = fileTree(dir: "src/test", include: "**/*.java") } + jmh { + warmupIterations = 10 + iterations = 10 + fork = 1 + // None of our benchmarks need the tests, and we have pseudo-circular + // dependencies that break when including them. (context's testCompile + // depends on core; core's testCompile depends on testing) + includeTests = false + } + task javadocJar(type: Jar) { classifier = 'javadoc' from javadoc diff --git a/benchmarks/src/jmh/java/io/grpc/context/AttachDetachBenchmark.java b/context/src/jmh/java/io/grpc/AttachDetachBenchmark.java similarity index 96% rename from benchmarks/src/jmh/java/io/grpc/context/AttachDetachBenchmark.java rename to context/src/jmh/java/io/grpc/AttachDetachBenchmark.java index aa94b6eb8b..52f0245c71 100644 --- a/benchmarks/src/jmh/java/io/grpc/context/AttachDetachBenchmark.java +++ b/context/src/jmh/java/io/grpc/AttachDetachBenchmark.java @@ -14,9 +14,8 @@ * limitations under the License. */ -package io.grpc.context; +package io.grpc; -import io.grpc.Context; import io.grpc.Context.Key; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; diff --git a/benchmarks/src/jmh/java/io/grpc/context/ReadBenchmark.java b/context/src/jmh/java/io/grpc/ReadBenchmark.java similarity index 98% rename from benchmarks/src/jmh/java/io/grpc/context/ReadBenchmark.java rename to context/src/jmh/java/io/grpc/ReadBenchmark.java index ce2ef18886..a789ed8984 100644 --- a/benchmarks/src/jmh/java/io/grpc/context/ReadBenchmark.java +++ b/context/src/jmh/java/io/grpc/ReadBenchmark.java @@ -14,9 +14,8 @@ * limitations under the License. */ -package io.grpc.context; +package io.grpc; -import io.grpc.Context; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; diff --git a/benchmarks/src/jmh/java/io/grpc/context/WriteBenchmark.java b/context/src/jmh/java/io/grpc/WriteBenchmark.java similarity index 97% rename from benchmarks/src/jmh/java/io/grpc/context/WriteBenchmark.java rename to context/src/jmh/java/io/grpc/WriteBenchmark.java index 3bf67e8768..f081900e91 100644 --- a/benchmarks/src/jmh/java/io/grpc/context/WriteBenchmark.java +++ b/context/src/jmh/java/io/grpc/WriteBenchmark.java @@ -14,9 +14,8 @@ * limitations under the License. */ -package io.grpc.context; +package io.grpc; -import io.grpc.Context; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; diff --git a/core/build.gradle b/core/build.gradle index 32d223cf4d..450f0badbf 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -18,3 +18,8 @@ javadoc { exclude 'io/grpc/Internal?*.java' exclude 'io/grpc/internal/**' } + +animalsniffer { + // Don't check sourceSets.jmh + sourceSets = [sourceSets.main, sourceSets.test] +} diff --git a/benchmarks/src/jmh/java/io/grpc/benchmarks/CallOptionsBenchmark.java b/core/src/jmh/java/io/grpc/CallOptionsBenchmark.java similarity index 98% rename from benchmarks/src/jmh/java/io/grpc/benchmarks/CallOptionsBenchmark.java rename to core/src/jmh/java/io/grpc/CallOptionsBenchmark.java index c2fdac961c..361ee65206 100644 --- a/benchmarks/src/jmh/java/io/grpc/benchmarks/CallOptionsBenchmark.java +++ b/core/src/jmh/java/io/grpc/CallOptionsBenchmark.java @@ -14,9 +14,8 @@ * limitations under the License. */ -package io.grpc.benchmarks; +package io.grpc; -import io.grpc.CallOptions; import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/benchmarks/src/jmh/java/io/grpc/DecompressorRegistryBenchmark.java b/core/src/jmh/java/io/grpc/DecompressorRegistryBenchmark.java similarity index 100% rename from benchmarks/src/jmh/java/io/grpc/DecompressorRegistryBenchmark.java rename to core/src/jmh/java/io/grpc/DecompressorRegistryBenchmark.java diff --git a/benchmarks/src/jmh/java/io/grpc/StatusBenchmark.java b/core/src/jmh/java/io/grpc/StatusBenchmark.java similarity index 100% rename from benchmarks/src/jmh/java/io/grpc/StatusBenchmark.java rename to core/src/jmh/java/io/grpc/StatusBenchmark.java diff --git a/benchmarks/src/jmh/java/io/grpc/internal/SerializingExecutorBenchmark.java b/core/src/jmh/java/io/grpc/internal/SerializingExecutorBenchmark.java similarity index 96% rename from benchmarks/src/jmh/java/io/grpc/internal/SerializingExecutorBenchmark.java rename to core/src/jmh/java/io/grpc/internal/SerializingExecutorBenchmark.java index 1f7e5cbc3c..dc402d1939 100644 --- a/benchmarks/src/jmh/java/io/grpc/internal/SerializingExecutorBenchmark.java +++ b/core/src/jmh/java/io/grpc/internal/SerializingExecutorBenchmark.java @@ -18,6 +18,7 @@ package io.grpc.internal; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.Phaser; import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; @@ -39,7 +40,7 @@ import org.openjdk.jmh.annotations.TearDown; @State(Scope.Thread) public class SerializingExecutorBenchmark { - private ExecutorService executorService; + private ExecutorService executorService = Executors.newSingleThreadExecutor(); private Executor executor = new SerializingExecutor(executorService); private static class IncrRunnable implements Runnable { @@ -94,4 +95,4 @@ public class SerializingExecutorBenchmark { throw new AssertionError(); } } -} \ No newline at end of file +} diff --git a/benchmarks/src/jmh/java/io/grpc/internal/StatsTraceContextBenchmark.java b/core/src/jmh/java/io/grpc/internal/StatsTraceContextBenchmark.java similarity index 100% rename from benchmarks/src/jmh/java/io/grpc/internal/StatsTraceContextBenchmark.java rename to core/src/jmh/java/io/grpc/internal/StatsTraceContextBenchmark.java diff --git a/netty/build.gradle b/netty/build.gradle index 9ed8fbd815..9dbeed893b 100644 --- a/netty/build.gradle +++ b/netty/build.gradle @@ -29,3 +29,9 @@ project.sourceSets { } } + +jmh { + // Workaround + // https://github.com/melix/jmh-gradle-plugin/issues/97#issuecomment-316664026 + includeTests = true +} diff --git a/benchmarks/src/jmh/java/io/grpc/netty/InboundHeadersBenchmark.java b/netty/src/jmh/java/io/grpc/netty/InboundHeadersBenchmark.java similarity index 100% rename from benchmarks/src/jmh/java/io/grpc/netty/InboundHeadersBenchmark.java rename to netty/src/jmh/java/io/grpc/netty/InboundHeadersBenchmark.java diff --git a/benchmarks/src/jmh/java/io/grpc/netty/MethodDescriptorBenchmark.java b/netty/src/jmh/java/io/grpc/netty/MethodDescriptorBenchmark.java similarity index 100% rename from benchmarks/src/jmh/java/io/grpc/netty/MethodDescriptorBenchmark.java rename to netty/src/jmh/java/io/grpc/netty/MethodDescriptorBenchmark.java diff --git a/benchmarks/src/jmh/java/io/grpc/netty/OutboundHeadersBenchmark.java b/netty/src/jmh/java/io/grpc/netty/OutboundHeadersBenchmark.java similarity index 100% rename from benchmarks/src/jmh/java/io/grpc/netty/OutboundHeadersBenchmark.java rename to netty/src/jmh/java/io/grpc/netty/OutboundHeadersBenchmark.java