bionic benchmarks: limit benchmark run time to 1s real time

The benchmark run loop tries to run until 1s of time has been
accumulated between StartBenchmarkTiming() and StopBenchmarkTiming().
If a majority of the time is spent stopped this can lead to
benchmarks running for very long periods of time.  This can easily
happen when benchmarking something that requires initialization or
cleanup on each iteration.

Modify the loop to run for 1s of real time instead of 1s of
benchmark time.  For existing benchmarks this shouldn't make much
of a difference.

Change-Id: Iaba8a13b4dfc4a5e2cd9992041c9173ea556f9cc
This commit is contained in:
Colin Cross 2013-11-27 17:37:54 -08:00 committed by Elliott Hughes
parent 3159972a80
commit a763504f9d

View file

@ -134,19 +134,23 @@ void Benchmark::RunRepeatedlyWithArg(int iterations, int arg) {
} }
void Benchmark::RunWithArg(int arg) { void Benchmark::RunWithArg(int arg) {
// run once in case it's expensive // Run once in case it's expensive.
int iterations = 1; int iterations = 1;
int64_t realStartTime = NanoTime();
RunRepeatedlyWithArg(iterations, arg); RunRepeatedlyWithArg(iterations, arg);
while (g_benchmark_total_time_ns < 1e9 && iterations < 1e9) { int64_t realTotalTime = NanoTime() - realStartTime;
while (realTotalTime < 1e9 && iterations < 1e8) {
int last = iterations; int last = iterations;
if (g_benchmark_total_time_ns/iterations == 0) { if (realTotalTime/iterations == 0) {
iterations = 1e9; iterations = 1e9;
} else { } else {
iterations = 1e9 / (g_benchmark_total_time_ns/iterations); iterations = 1e9 / (realTotalTime/iterations);
} }
iterations = std::max(last + 1, std::min(iterations + iterations/2, 100*last)); iterations = std::max(last + 1, std::min(iterations + iterations/2, 100*last));
iterations = Round(iterations); iterations = Round(iterations);
realStartTime = NanoTime();
RunRepeatedlyWithArg(iterations, arg); RunRepeatedlyWithArg(iterations, arg);
realTotalTime = NanoTime() - realStartTime;
} }
char throughput[100]; char throughput[100];