11 std::optional
<std::uint32_t> thread_count
;
12 std::optional
<std::uint64_t> iteration_count
;
15 template <typename Fn
, typename Input
,
16 typename Output
= std::invoke_result_t
<Fn
, Input
>>
19 class BenchHarnessBase
21 template <typename Fn
, typename Input
, typename Output
>
22 friend class BenchHarness
;
25 void base_run(Config config
,
26 void (*fn
)(BenchHarnessBase
*bench_harness_base
,
27 std::uint64_t iteration_count
));
30 template <typename Fn
, typename Input
>
31 class BenchHarness
<Fn
, Input
, std::invoke_result_t
<Fn
, Input
>> final
32 : private BenchHarnessBase
38 void run(Config config
)
40 base_run(config
, [](BenchHarnessBase
*bench_harness_base
,
41 std::uint64_t iteration_count
) {
42 auto &fn
= static_cast<BenchHarness
*>(bench_harness_base
)->fn
;
43 for (std::uint64_t i
= 0; i
< iteration_count
; i
++)
47 // optimization barrier
48 asm("" : : "r"(std::addressof(input
)) : "memory");
50 auto output
= fn(input
);
52 // optimization barrier
53 asm("" : : "r"(std::addressof(output
)) : "memory");