30 #include <type_traits> 32 #include <boost/function_types/function_arity.hpp> 33 #include <glog/logging.h> 49 if (FLAGS_benchmark) {
52 return FLAGS_benchmark;
58 std::pair<std::chrono::high_resolution_clock::duration, unsigned int>;
59 using BenchmarkFun = std::function<detail::TimeIterPair(unsigned int)>;
88 using Clock = std::chrono::high_resolution_clock;
142 explicit operator bool()
const {
168 template <
typename Lambda>
169 typename std::enable_if<
170 boost::function_types::function_arity<
173 auto execute = [=](
unsigned int times) {
179 niter = lambda(
times);
197 template <
typename Lambda>
198 typename std::enable_if<
199 boost::function_types::function_arity<
200 decltype(&Lambda::operator())>::value == 1>
::type 203 unsigned int niter = 0;
204 while (times-- > 0) {
226 #pragma optimize("", off) 228 inline void doNotOptimizeDependencySink(
const void*) {}
230 #pragma optimize("", on) 234 doNotOptimizeDependencySink(&datum);
237 template <
typename T>
239 doNotOptimizeDependencySink(&datum);
245 template <
typename T>
257 template <
typename T>
271 asm volatile(
"" ::
"r"(datum));
274 template <
typename T>
281 asm volatile(
"" ::
"m"(datum) :
"memory");
284 template <
typename T>
287 asm volatile(
"" :
"+r"(datum));
290 template <
typename T>
293 asm volatile(
"" ::
"m"(datum) :
"memory");
301 const std::vector<detail::BenchmarkResult>&
data,
306 std::vector<detail::BenchmarkResult>&);
309 const std::vector<detail::BenchmarkResult>& base,
310 const std::vector<detail::BenchmarkResult>&
test);
318 #define BENCHMARK_IMPL(funName, stringName, rv, paramType, paramName) \ 319 static void funName(paramType); \ 320 static bool FB_ANONYMOUS_VARIABLE(follyBenchmarkUnused) = \ 321 (::folly::addBenchmark( \ 324 [](paramType paramName) -> unsigned { \ 325 funName(paramName); \ 329 static void funName(paramType paramName) 336 #define BENCHMARK_MULTI_IMPL(funName, stringName, paramType, paramName) \ 337 static unsigned funName(paramType); \ 338 static bool FB_ANONYMOUS_VARIABLE(follyBenchmarkUnused) = \ 339 (::folly::addBenchmark( \ 342 [](paramType paramName) { return funName(paramName); }), \ 344 static unsigned funName(paramType paramName) 365 #define BENCHMARK(name, ...) \ 368 FB_STRINGIZE(name), \ 369 FB_ARG_2_OR_1(1, ##__VA_ARGS__), \ 370 FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ 388 #define BENCHMARK_MULTI(name, ...) \ 389 BENCHMARK_MULTI_IMPL( \ 391 FB_STRINGIZE(name), \ 392 FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ 417 #define BENCHMARK_PARAM(name, param) BENCHMARK_NAMED_PARAM(name, param, param) 423 #define BENCHMARK_PARAM_MULTI(name, param) \ 424 BENCHMARK_NAMED_PARAM_MULTI(name, param, param) 449 #define BENCHMARK_NAMED_PARAM(name, param_name, ...) \ 451 FB_CONCATENATE(name, FB_CONCATENATE(_, param_name)), \ 452 FB_STRINGIZE(name) "(" FB_STRINGIZE(param_name) ")", \ 456 name(iters, ##__VA_ARGS__); \ 463 #define BENCHMARK_NAMED_PARAM_MULTI(name, param_name, ...) \ 464 BENCHMARK_MULTI_IMPL( \ 465 FB_CONCATENATE(name, FB_CONCATENATE(_, param_name)), \ 466 FB_STRINGIZE(name) "(" FB_STRINGIZE(param_name) ")", \ 469 return name(iters, ##__VA_ARGS__); \ 496 #define BENCHMARK_RELATIVE(name, ...) \ 499 "%" FB_STRINGIZE(name), \ 500 FB_ARG_2_OR_1(1, ##__VA_ARGS__), \ 501 FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ 508 #define BENCHMARK_RELATIVE_MULTI(name, ...) \ 509 BENCHMARK_MULTI_IMPL( \ 511 "%" FB_STRINGIZE(name), \ 512 FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ 518 #define BENCHMARK_RELATIVE_PARAM(name, param) \ 519 BENCHMARK_RELATIVE_NAMED_PARAM(name, param, param) 525 #define BENCHMARK_RELATIVE_PARAM_MULTI(name, param) \ 526 BENCHMARK_RELATIVE_NAMED_PARAM_MULTI(name, param, param) 531 #define BENCHMARK_RELATIVE_NAMED_PARAM(name, param_name, ...) \ 533 FB_CONCATENATE(name, FB_CONCATENATE(_, param_name)), \ 534 "%" FB_STRINGIZE(name) "(" FB_STRINGIZE(param_name) ")", \ 538 name(iters, ##__VA_ARGS__); \ 545 #define BENCHMARK_RELATIVE_NAMED_PARAM_MULTI(name, param_name, ...) \ 546 BENCHMARK_MULTI_IMPL( \ 547 FB_CONCATENATE(name, FB_CONCATENATE(_, param_name)), \ 548 "%" FB_STRINGIZE(name) "(" FB_STRINGIZE(param_name) ")", \ 551 return name(iters, ##__VA_ARGS__); \ 557 #define BENCHMARK_DRAW_LINE() \ 558 static bool FB_ANONYMOUS_VARIABLE(follyBenchmarkUnused) = \ 559 (::folly::addBenchmark(__FILE__, "-", []() -> unsigned { return 0; }), \ 576 #define BENCHMARK_SUSPEND \ 577 if (auto FB_ANONYMOUS_VARIABLE(BENCHMARK_SUSPEND) = \ 578 ::folly::BenchmarkSuspender()) { \
Clock::time_point TimePoint
typename invoke_result< F, Args... >::type invoke_result_t
typename std::decay< T >::type Decayed
std::chrono::steady_clock::time_point now()
void addBenchmarkImpl(const char *file, const char *name, std::function< TimeIterPair(unsigned int)>)
void benchmarkResultsFromDynamic(const dynamic &d, vector< detail::BenchmarkResult > &results)
—— Concurrent Priority Queue Implementation ——
requires E e noexcept(noexcept(s.error(std::move(e))))
std::chrono::high_resolution_clock Clock
FOLLY_PUSH_WARNING RHS rhs
void benchmarkResultsToDynamic(const vector< detail::BenchmarkResult > &data, dynamic &out)
std::pair< std::chrono::high_resolution_clock::duration, unsigned int > TimeIterPair
auto end(TestAdlIterable &instance)
constexpr auto data(C &c) -> decltype(c.data())
std::is_trivially_copyable< T > is_trivially_copyable
static const char *const value
BenchmarkSuspender & operator=(BenchmarkSuspender &&rhs)
std::function< detail::TimeIterPair(unsigned int)> BenchmarkFun
BenchmarkSuspender(BenchmarkSuspender &&rhs) noexcept
static Duration timeSpent
auto dismissing(F f) -> invoke_result_t< F >
bool runBenchmarksOnFlag()
uint64_t value(const typename LockFreeRingBuffer< T, Atom >::Cursor &rbcursor)
std::enable_if< boost::function_types::function_arity< decltype(&Lambda::operator())>::value==2 >::type addBenchmark(const char *file, const char *name, Lambda &&lambda)
Future< Unit > times(const int n, F &&thunk)
void printResultComparison(const vector< detail::BenchmarkResult > &base, const vector< detail::BenchmarkResult > &test)
auto makeUnpredictable(T &datum) -> typename std::enable_if< !detail::DoNotOptimizeAwayNeedsIndirect< T >::value >::type
auto doNotOptimizeAway(const T &datum) -> typename std::enable_if< !detail::DoNotOptimizeAwayNeedsIndirect< T >::value >::type