diff options
| author | Gavin Andresen <[email protected]> | 2015-09-29 17:17:24 -0400 |
|---|---|---|
| committer | Gavin Andresen <[email protected]> | 2015-09-30 09:24:42 -0400 |
| commit | 7072c544b52774ac5a22835121e8e2747ad61158 (patch) | |
| tree | 61bab3fc434f5c058ef43a73cf2cc3b4fd78661a /src | |
| parent | Simple benchmarking framework (diff) | |
| download | discoin-7072c544b52774ac5a22835121e8e2747ad61158.tar.xz discoin-7072c544b52774ac5a22835121e8e2747ad61158.zip | |
Support very-fast-running benchmarks
Avoid calling gettimeofday every time through the benchmarking loop, by keeping
track of how long each loop takes and doubling the number of iterations done
between time checks when they take less than 1/16'th of the total elapsed time.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.bench.include | 2 | ||||
| -rw-r--r-- | src/bench/Examples.cpp (renamed from src/bench/MilliSleep.cpp) | 18 | ||||
| -rw-r--r-- | src/bench/bench.cpp | 14 | ||||
| -rw-r--r-- | src/bench/bench.h | 2 |
4 files changed, 32 insertions, 4 deletions
diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include index 126e3a102..61fe9e287 100644 --- a/src/Makefile.bench.include +++ b/src/Makefile.bench.include @@ -7,7 +7,7 @@ bench_bench_bitcoin_SOURCES = \ bench/bench_bitcoin.cpp \ bench/bench.cpp \ bench/bench.h \ - bench/MilliSleep.cpp + bench/Examples.cpp bench_bench_bitcoin_CPPFLAGS = $(BITCOIN_INCLUDES) $(EVENT_CLFAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/ bench_bench_bitcoin_LDADD = \ diff --git a/src/bench/MilliSleep.cpp b/src/bench/Examples.cpp index 991397a23..b6b020a97 100644 --- a/src/bench/MilliSleep.cpp +++ b/src/bench/Examples.cpp @@ -6,6 +6,8 @@ #include "main.h" #include "utiltime.h" +// Sanity test: this should loop ten times, and +// min/max/average should be close to 100ms. static void Sleep100ms(benchmark::State& state) { while (state.KeepRunning()) { @@ -14,3 +16,19 @@ static void Sleep100ms(benchmark::State& state) } BENCHMARK(Sleep100ms); + +// Extremely fast-running benchmark: +#include <math.h> + +volatile double sum = 0.0; // volatile, global so not optimized away + +static void Trig(benchmark::State& state) +{ + double d = 0.01; + while (state.KeepRunning()) { + sum += sin(d); + d += 0.000001; + } +} + +BENCHMARK(Trig); diff --git a/src/bench/bench.cpp b/src/bench/bench.cpp index 572080760..89c3b0cc2 100644 --- a/src/bench/bench.cpp +++ b/src/bench/bench.cpp @@ -36,14 +36,22 @@ BenchRunner::RunAll(double elapsedTimeForOne) bool State::KeepRunning() { - double now = gettimedouble(); + double now; if (count == 0) { - beginTime = now; + beginTime = now = gettimedouble(); } else { - double elapsedOne = now - lastTime; + // timeCheckCount is used to avoid calling gettime most of the time, + // so benchmarks that run very quickly get consistent results. + if ((count+1)%timeCheckCount != 0) { + ++count; + return true; // keep going + } + now = gettimedouble(); + double elapsedOne = (now - lastTime)/timeCheckCount; if (elapsedOne < minTime) minTime = elapsedOne; if (elapsedOne > maxTime) maxTime = elapsedOne; + if (elapsedOne*timeCheckCount < maxElapsed/16) timeCheckCount *= 2; } lastTime = now; ++count; diff --git a/src/bench/bench.h b/src/bench/bench.h index fee9b8c38..bf591a2be 100644 --- a/src/bench/bench.h +++ b/src/bench/bench.h @@ -41,10 +41,12 @@ namespace benchmark { double beginTime; double lastTime, minTime, maxTime; int64_t count; + int64_t timeCheckCount; public: State(std::string _name, double _maxElapsed) : name(_name), maxElapsed(_maxElapsed), count(0) { minTime = std::numeric_limits<double>::max(); maxTime = std::numeric_limits<double>::min(); + timeCheckCount = 1; } bool KeepRunning(); }; |