Benchmark Inheritance
Alex Averbuch
alex.averbuch at neotechnology.com
Wed Jun 22 23:05:28 UTC 2016
FYI, replacing this:
protected abstract PropertyDefinition propertyDefinition();
With this:
protected PropertyDefinition propertyDefinition()
{
throw new RuntimeException( "Should never happen?" );
}
Let's the project successfully compile but then fails at runtime because,
it turns out, PropertyReadBenchmark.propertyDefinition() is called even
though PropertyReadBenchmark is abstract.
--- The Error ---
java.lang.RuntimeException: Should never happen?
at
org.me.bench.PropertyReadBenchmark.propertyDefinition(PropertyReadBenchmark.java:57)
at
org.me.bench.PropertyReadBenchmark.<init>(PropertyReadBenchmark.java:38)
at
org.me.bench.generated.PropertyReadBenchmark_jmhType_B1.<init>(PropertyReadBenchmark_jmhType_B1.java:3)
at
org.me.bench.generated.PropertyReadBenchmark_jmhType_B2.<init>(PropertyReadBenchmark_jmhType_B2.java:3)
at
org.me.bench.generated.PropertyReadBenchmark_jmhType_B3.<init>(PropertyReadBenchmark_jmhType_B3.java:2)
at
org.me.bench.generated.PropertyReadBenchmark_jmhType.<init>(PropertyReadBenchmark_jmhType.java:2)
at
org.me.bench.generated.IntPropertyRead_getProperty_jmhTest._jmh_tryInit_f_PropertyReadBenchmark3_G(IntPropertyRead_getProperty_jmhTest.java:482)
at
org.me.bench.generated.IntPropertyRead_getProperty_jmhTest.getProperty_SampleTime(IntPropertyRead_getProperty_jmhTest.java:266)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at
org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:430)
at
org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:412)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Benchmark had encountered error, and fail on error was requested
Exception in thread "main" java.lang.RuntimeException: Error running JMH
benchmark
at org.me.bench.client.RunCommand.run(RunCommand.java:156)
at org.me.bench.client.Main.main(Main.java:17)
Caused by: org.openjdk.jmh.runner.RunnerException: Benchmark caught the
exception
at org.openjdk.jmh.runner.Runner.runBenchmarks(Runner.java:558)
at org.openjdk.jmh.runner.Runner.internalRun(Runner.java:313)
at org.openjdk.jmh.runner.Runner.run(Runner.java:206)
at org.me.bench.client.RunCommand.run(RunCommand.java:144)
... 1 more
Caused by: java.lang.RuntimeException: Should never happen?
at
org.me.bench.PropertyReadBenchmark.propertyDefinition(PropertyReadBenchmark.java:57)
at
org.me.bench.PropertyReadBenchmark.<init>(PropertyReadBenchmark.java:38)
at
org.me.bench.generated.PropertyReadBenchmark_jmhType_B1.<init>(PropertyReadBenchmark_jmhType_B1.java:3)
at
org.me.bench.generated.PropertyReadBenchmark_jmhType_B2.<init>(PropertyReadBenchmark_jmhType_B2.java:3)
at
org.me.bench.generated.PropertyReadBenchmark_jmhType_B3.<init>(PropertyReadBenchmark_jmhType_B3.java:2)
at
org.me.bench.generated.PropertyReadBenchmark_jmhType.<init>(PropertyReadBenchmark_jmhType.java:2)
at
org.me.bench.generated.IntPropertyRead_getProperty_jmhTest._jmh_tryInit_f_PropertyReadBenchmark3_G(IntPropertyRead_getProperty_jmhTest.java:482)
at
org.me.bench.generated.IntPropertyRead_getProperty_jmhTest.getProperty_SampleTime(IntPropertyRead_getProperty_jmhTest.java:266)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at
org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:430)
at
org.openjdk.jmh.runner.BenchmarkHandler$BenchmarkTask.call(BenchmarkHandler.java:412)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
On Wed, Jun 22, 2016 at 2:51 PM, Alex Averbuch <
alex.averbuch at neotechnology.com> wrote:
> I would like for multiple "benchmark" classes to inherit from one base
> benchmark, where the base benchmark contains all @benchmark methods, and
> child classes specify the actual data to run against (it is a database
> benchmark).
>
> I've read through the JMH examples. From what I can tell the pattern I am
> using "should" work, but it does not. My code (three-class hierarchy) & the
> error are below.
>
> Any ideas?
>
> Thanks in advance!
>
> --- The Error ---
>
> [ERROR] Failed to execute goal
> org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
> (default-compile) on project jmh-benchmarks: Compilation failure
> [ERROR]
> /Users/me/IdeaProjects/jmh-benchmarks/target/generated-sources/annotations/org/me/bench/generated/PropertyReadBenchmark_jmhType_B1.java:[3,8]
> org.me.bench.generated.PropertyReadBenchmark_jmhType_B1 is not abstract and
> does not override abstract method propertyDefinition() in
> org.me.bench.PropertyReadBenchmark
>
>
> --- The Code ---
>
>
> @State( Scope.Benchmark )
> public abstract class BaseBenchmark
> {
> protected Database db;
>
> @Setup
> public void setUp()
> {
> db = new DataGenerator().generate(getConfig());
> }
>
> protected DataGeneratorConfig getConfig()
> {
> return new DataGeneratorConfigBuilder().build();
> }
>
> @TearDown
> public void tearDown()
> {
> db.shutdown();
> }
> }
>
> public abstract class PropertyReadBenchmark extends BaseBenchmark
> {
> private final PropertyDefinition propertyDefinition;
>
> public PropertyReadBenchmark()
> {
> this.propertyDefinition = propertyDefinition();
> }
>
> @Override
> protected DataGeneratorConfig getConfig()
> {
> return new DataGeneratorConfigBuilder()
> .withProperties( propertyDefinition )
> .build();
> }
>
> // NOTE: causes compilation failure!
> protected abstract PropertyDefinition propertyDefinition();
>
> @State( Scope.Thread )
> public static class TxState
> {
> Transaction tx;
>
> @Setup
> public void setUp( PropertyReadBenchmark benchmarkState )
> {
> this.tx = benchmarkState.db.beginTx();
> }
>
> @TearDown
> public void tearDown()
> {
> tx.close();
> }
>
> }
>
> @Benchmark
> public Object getProperty( TxState txState )
> {
> return db.getProperty( propertyDefinition.key() );
> }
> }
>
> public class IntPropertyRead extends PropertyReadBenchmark
> {
> @Override
> protected PropertyDefinition propertyDefinition()
> {
> return new PropertyDefinition( "int", ValueGenerator.INTEGER );
> }
> }
>
>
>
>
More information about the jmh-dev
mailing list