21 #include "absl/flags/flag.h"
22 #include "absl/flags/marshalling.h"
23 #include "absl/flags/parse.h"
24 #include "absl/flags/reflection.h"
25 #include "absl/strings/string_view.h"
26 #include "absl/time/time.h"
27 #include "absl/types/optional.h"
28 #include "benchmark/benchmark.h"
32 using VectorOfStrings = std::vector<std::string>;
39 struct OptionalInt : AbslOptionalInt {
40 using AbslOptionalInt::AbslOptionalInt;
58 struct OptionalString : AbslOptionalString {
59 using AbslOptionalString::AbslOptionalString;
87 #define BENCHMARKED_TYPES(A) \
104 #define FLAG_DEF(T) ABSL_FLAG(T, T##_flag, {}, "");
106 #if defined(__clang__) && defined(__linux__)
111 #pragma clang section data = ".benchmark_flags"
114 #if defined(__clang__) && defined(__linux__)
115 #pragma clang section data = ""
119 #define DEFINE_FLAG_0(name) ABSL_FLAG(int, name, 0, "");
120 #define DEFINE_FLAG_1(name) DEFINE_FLAG_0(name##0) DEFINE_FLAG_0(name##1)
121 #define DEFINE_FLAG_2(name) DEFINE_FLAG_1(name##0) DEFINE_FLAG_1(name##1)
122 #define DEFINE_FLAG_3(name) DEFINE_FLAG_2(name##0) DEFINE_FLAG_2(name##1)
123 #define DEFINE_FLAG_4(name) DEFINE_FLAG_3(name##0) DEFINE_FLAG_3(name##1)
124 #define DEFINE_FLAG_5(name) DEFINE_FLAG_4(name##0) DEFINE_FLAG_4(name##1)
125 #define DEFINE_FLAG_6(name) DEFINE_FLAG_5(name##0) DEFINE_FLAG_5(name##1)
126 #define DEFINE_FLAG_7(name) DEFINE_FLAG_6(name##0) DEFINE_FLAG_6(name##1)
127 #define DEFINE_FLAG_8(name) DEFINE_FLAG_7(name##0) DEFINE_FLAG_7(name##1)
128 #define DEFINE_FLAG_9(name) DEFINE_FLAG_8(name##0) DEFINE_FLAG_8(name##1)
129 #define DEFINE_FLAG_10(name) DEFINE_FLAG_9(name##0) DEFINE_FLAG_9(name##1)
130 #define DEFINE_FLAG_11(name) DEFINE_FLAG_10(name##0) DEFINE_FLAG_10(name##1)
131 #define DEFINE_FLAG_12(name) DEFINE_FLAG_11(name##0) DEFINE_FLAG_11(name##1)
136 #define BM_GetFlag(T) \
137 void BM_GetFlag_##T(benchmark::State& state) { \
138 for (auto _ : state) { \
139 benchmark::DoNotOptimize(absl::GetFlag(FLAGS_##T##_flag)); \
142 BENCHMARK(BM_GetFlag_##T)->ThreadRange(1, 16);
147 char dummy[] =
"dummy";
148 char* argv[] = {
dummy};
153 for (
auto s :
state) {
158 BENCHMARK(BM_ThreadedFindCommandLineFlag)->ThreadRange(1, 16);
162 #define InvokeGetFlag(T) \
163 T AbslInvokeGetFlag##T() { return absl::GetFlag(FLAGS_##T##_flag); } \
164 int odr##T = (benchmark::DoNotOptimize(AbslInvokeGetFlag##T), 1);