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