BenchMark
框架基于这样一种思维:测量时候肯定有噪声的存在,导致咱们的测量值偏大。因而不应该对多组测量后果求均匀,而是应该求最小值。
- 第一个乏味的中央是如何确保一个无用的表达式求值,
Folly
中是利用了句号表达式 + 匿名变量
#define BENCHMARK_IMPL(funName, stringName, rv, paramType, paramName) \
static void funName(paramType); \
FOLLY_MAYBE_UNUSED static bool FB_ANONYMOUS_VARIABLE(follyBenchmarkUnused) = \
(::folly::addBenchmark( \
__FILE__, \
stringName, \
[](paramType paramName) -> unsigned { \
funName(paramName); \
return rv; \
}), \
true); \
static void funName(paramType paramName)
宏开展之后,就实现了函数的申明和并将测试函数注入框架。
- 第二个有意思的中央是如何保障一个变量的申明周期在整个代码块内,即咱们心愿
BENCHMARK_SUSPEND {v.reserve(n);
}
BENCHMARK_SUSPEND
是通过管制对应变量的生命周期管制计时流程的,因而,咱们心愿在这个宏中结构的变量的生命周期贯通整个代码块。
#define BENCHMARK_SUSPEND \
if (auto FB_ANONYMOUS_VARIABLE(BENCHMARK_SUSPEND) = \
::folly::BenchmarkSuspender()) {\} else
十分奇妙的利用了在 if
中申明的变量的 scope
在 else 之后完结的冷常识 ref: