1e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin/* 2e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Copyright (C) 2011 Google Inc. 3e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * 4e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 5e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * you may not use this file except in compliance with the License. 6e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * You may obtain a copy of the License at 7e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * 8e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 9e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * 10e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Unless required by applicable law or agreed to in writing, software 11e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 12e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * See the License for the specific language governing permissions and 14e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * limitations under the License. 15e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin */ 16e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 17e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinpackage com.google.caliper.worker; 18e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 19e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.model.ArbitraryMeasurement; 20e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.model.Measurement; 21e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.model.Value; 22e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.runner.Running.Benchmark; 23e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.runner.Running.BenchmarkMethod; 24e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.util.Util; 25e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.collect.ImmutableSet; 26e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 27e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport java.lang.reflect.Method; 28e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport java.util.Map; 29e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 30e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport javax.inject.Inject; 31e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 32e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin/** 33e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Worker for arbitrary measurements. 34e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin */ 35e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinpublic final class ArbitraryMeasurementWorker extends Worker { 36e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin private final Options options; 37e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin private final String unit; 38e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin private final String description; 39e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 40e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Inject ArbitraryMeasurementWorker( 41e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Benchmark Object benchmark, 42e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @BenchmarkMethod Method method, 43e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @WorkerOptions Map<String, String> workerOptions) { 44e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin super(benchmark, method); 45e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin this.options = new Options(workerOptions); 46e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin ArbitraryMeasurement annotation = method.getAnnotation(ArbitraryMeasurement.class); 47e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin this.unit = annotation.units(); 48e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin this.description = annotation.description(); 49e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 50e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 51e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Override public void preMeasure(boolean inWarmup) throws Exception { 52e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin if (options.gcBeforeEach && !inWarmup) { 53e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin Util.forceGc(); 54e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 55e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 56e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 57e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Override public Iterable<Measurement> measure() throws Exception { 58e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin double measured = (Double) benchmarkMethod.invoke(benchmark); 59e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin return ImmutableSet.of(new Measurement.Builder() 60e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin .value(Value.create(measured, unit)) 61e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin .weight(1) 62e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin .description(description) 63e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin .build()); 64e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 65e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 66e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin private static class Options { 67e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin final boolean gcBeforeEach; 68e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 69e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin Options(Map<String, String> options) { 70e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin this.gcBeforeEach = Boolean.parseBoolean(options.get("gcBeforeEach")); 71e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 72e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 73e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin} 74