/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.tinkerpop.benchmark.util; import org.junit.Test; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.results.format.ResultFormatType; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.options.ChainedOptionsBuilder; import org.openjdk.jmh.runner.options.OptionsBuilder; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; /** * Base class for all TinkerPop OpenJDK JMH benchmarks. Based upon Netty's approach to running JMH benchmarks * from JUnit. * * @see <a href="http://netty.io/wiki/microbenchmarks.html"</a> * * @author Ted Wilmes (http://twilmes.org) */ @Warmup(iterations = AbstractBenchmarkBase.DEFAULT_WARMUP_ITERATIONS) @Measurement(iterations = AbstractBenchmarkBase.DEFAULT_MEASURE_ITERATIONS) @Fork(AbstractBenchmarkBase.DEFAULT_FORKS) public abstract class AbstractBenchmarkBase { protected static final int DEFAULT_WARMUP_ITERATIONS = 10; protected static final int DEFAULT_MEASURE_ITERATIONS = 10; protected static final int DEFAULT_FORKS = 2; protected static final String DEFAULT_BENCHMARK_DIRECTORY = "./benchmarks/"; protected static final String DEFAULT_JVM_ARGS = "-server -Xms2g -Xmx2g"; @Test public void run() throws Exception { final String className = getClass().getSimpleName(); final ChainedOptionsBuilder runnerOptions = new OptionsBuilder() .include(".*" + className + ".*") .jvmArgs(getJvmArgs()); if (getWarmupIterations() > 0) { runnerOptions.warmupIterations(getWarmupIterations()); } if (getMeasureIterations() > 0) { runnerOptions.measurementIterations(getMeasureIterations()); } if (getForks() > 0) { runnerOptions.forks(getForks()); } if (getReportDir() != null) { final String dtmStr = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); final String filePath = getReportDir() + className + "-" + dtmStr + ".json"; final File file = new File(filePath); if (file.exists()) { file.delete(); } else { file.getParentFile().mkdirs(); file.createNewFile(); } runnerOptions.resultFormat(ResultFormatType.JSON); runnerOptions.result(filePath); } new Runner(runnerOptions.build()).run(); } protected int getWarmupIterations() { return getIntProperty("warmupIterations", DEFAULT_WARMUP_ITERATIONS); } protected int getMeasureIterations() { return getIntProperty("measureIterations", DEFAULT_MEASURE_ITERATIONS); } protected int getForks() { return getIntProperty("forks", DEFAULT_FORKS); } protected String getReportDir() { return System.getProperty("benchmarkReportDir", DEFAULT_BENCHMARK_DIRECTORY); } protected String[] getJvmArgs() { return System.getProperty("jvmArgs", DEFAULT_JVM_ARGS).split(" "); } private int getIntProperty(final String propertyName, final int defaultValue) { final String propertyValue = System.getProperty(propertyName); if(propertyValue == null) { return defaultValue; } return Integer.valueOf(propertyValue); } }