From f8147e89c8fc8c1096ccac2587adde4211317730 Mon Sep 17 00:00:00 2001 From: Yedidya Feldblum Date: Mon, 27 Apr 2015 12:49:35 -0700 Subject: [PATCH] BenchmarkSuspender::dismissing. Summary: [Folly] BenchmarkSuspender::dismissing. Pass a lambda to it, and the lambda will be executed while the benchmark-suspender is dismissed. Just a bit of sugar around `BenchmarkSuspender::dismiss` and `BenchmarkSuspender::rehire`. BENCHMARK(name_void, iters) { BenchmarkSuspender braces; # benchmark timer is suspended braces.dismissing([&] { # benchmark timer is running doSomething(); }); # benchmark timer is suspended } BENCHMARK(name_value, iters) { BenchmarkSuspender braces; # benchmark timer is suspended auto value = braces.dismissing([&] { # benchmark timer is running return doSomething(); }); # benchmark timer is suspended } Test Plan: Unit tests: * `folly/test/BenchmarkTest.cpp` (actually a benchmark) Reviewed By: njormrod@fb.com Subscribers: net-systems@, folly-diffs@, yfeldblum, chalfant FB internal diff: D2024166 Signature: t1:2024166:1430163281:24df0ac98cbe36372f780372ee8f7dd3722b7868 --- folly/Benchmark.h | 9 +++++++++ folly/test/BenchmarkTest.cpp | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/folly/Benchmark.h b/folly/Benchmark.h index dd11a006..3478d10f 100644 --- a/folly/Benchmark.h +++ b/folly/Benchmark.h @@ -17,6 +17,7 @@ #ifndef FOLLY_BENCHMARK_H_ #define FOLLY_BENCHMARK_H_ +#include #include #include // for FB_ANONYMOUS_VARIABLE #include @@ -26,6 +27,7 @@ #include #include #include +#include DECLARE_bool(benchmark); @@ -149,6 +151,13 @@ struct BenchmarkSuspender { CHECK_EQ(0, clock_gettime(detail::DEFAULT_CLOCK_ID, &start)); } + template + auto dismissing(F f) -> typename std::result_of::type { + SCOPE_EXIT { rehire(); }; + dismiss(); + return f(); + } + /** * This is for use inside of if-conditions, used in BENCHMARK macros. * If-conditions bypass the explicit on operator bool. diff --git a/folly/test/BenchmarkTest.cpp b/folly/test/BenchmarkTest.cpp index 4b4d2080..116ecb37 100644 --- a/folly/test/BenchmarkTest.cpp +++ b/folly/test/BenchmarkTest.cpp @@ -17,7 +17,11 @@ #include #include #include +#include #include +#include +#include +#include using namespace folly; using namespace std; @@ -128,6 +132,38 @@ BENCHMARK_RELATIVE_PARAM_MULTI(paramMultiRel, 1); BENCHMARK_PARAM_MULTI(paramMulti, 5); BENCHMARK_RELATIVE_PARAM_MULTI(paramMultiRel, 5); +BENCHMARK_DRAW_LINE(); + +BENCHMARK(BenchmarkSuspender_dismissing_void, iter) { + BenchmarkSuspender braces; + mt19937_64 rng; + while (iter--) { + vector v(1 << 12, 0); + iota(v.begin(), v.end(), 0); + shuffle(v.begin(), v.end(), rng); + braces.dismissing([&] { + sort(v.begin(), v.end()); + }); + } +} + +BENCHMARK(BenchmarkSuspender_dismissing_value, iter) { + BenchmarkSuspender braces; + mt19937_64 rng; + while (iter--) { + vector v(1 << 12, 0); + iota(v.begin(), v.end(), 0); + shuffle(v.begin(), v.end(), rng); + auto s = braces.dismissing([&] { + sort(v.begin(), v.end()); + return accumulate(v.begin(), v.end(), 0, [](size_t a, size_t e) { + return a + e; + }); + }); + doNotOptimizeAway(s); + } +} + int main(int argc, char** argv) { gflags::ParseCommandLineFlags(&argc, &argv, true); runBenchmarks(); -- 2.34.1