blob: 855101e8ded8ebe2114ffe3a47a8b101730556c6 [file] [log] [blame]
/**
* Copyright (C) 2009 Google Inc.
*
* Licensed 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 com.google.caliper;
import static com.google.common.base.Preconditions.checkArgument;
/**
* Measure's the benchmark's per-trial execution time.
*/
class Caliper {
private final long warmupNanos;
private final long runNanos;
public Caliper(long warmupMillis, long runMillis) {
checkArgument(warmupMillis > 50);
checkArgument(runMillis > 50);
this.warmupNanos = warmupMillis * 1000000;
this.runNanos = runMillis * 1000000;
}
public double warmUp(Benchmark benchmark) throws Exception {
long startNanos = System.nanoTime();
long endNanos = startNanos + warmupNanos;
int trials = 0;
long currentNanos;
while ((currentNanos = System.nanoTime()) < endNanos) {
benchmark.run(1);
trials++;
}
double nanosPerExecution = (currentNanos - startNanos) / trials;
if (nanosPerExecution > 1000000000 || nanosPerExecution < 2) {
throw new ConfigurationException("Runtime out of range");
}
return nanosPerExecution;
}
/**
* In the run proper, we predict how extrapolate based on warmup how many
* runs we're going to need, and run them all in a single batch.
*/
public double run(Benchmark test, double estimatedNanosPerTrial) throws Exception {
int trials = (int) (runNanos / estimatedNanosPerTrial);
long startNanos = System.nanoTime();
test.run(trials);
long endNanos = System.nanoTime();
estimatedNanosPerTrial = (endNanos - startNanos) / trials;
return estimatedNanosPerTrial;
}
}