benchmark/test/complexity_test.cc
Go to the documentation of this file.
1 #undef NDEBUG
2 #include <algorithm>
3 #include <cassert>
4 #include <cmath>
5 #include <cstdlib>
6 #include <vector>
7 #include "benchmark/benchmark.h"
8 #include "output_test.h"
9 
10 namespace {
11 
12 #define ADD_COMPLEXITY_CASES(...) \
13  int CONCAT(dummy, __LINE__) = AddComplexityTest(__VA_ARGS__)
14 
15 int AddComplexityTest(std::string test_name, std::string big_o_test_name,
16  std::string rms_test_name, std::string big_o,
17  int family_index) {
18  SetSubstitutions({{"%name", test_name},
19  {"%bigo_name", big_o_test_name},
20  {"%rms_name", rms_test_name},
21  {"%bigo_str", "[ ]* %float " + big_o},
22  {"%bigo", big_o},
23  {"%rms", "[ ]*[0-9]+ %"}});
24  AddCases(
26  {{"^%bigo_name %bigo_str %bigo_str[ ]*$"},
27  {"^%bigo_name", MR_Not}, // Assert we we didn't only matched a name.
28  {"^%rms_name %rms %rms[ ]*$", MR_Next}});
29  AddCases(
30  TC_JSONOut,
31  {{"\"name\": \"%bigo_name\",$"},
32  {"\"family_index\": " + std::to_string(family_index) + ",$", MR_Next},
33  {"\"per_family_instance_index\": 0,$", MR_Next},
34  {"\"run_name\": \"%name\",$", MR_Next},
35  {"\"run_type\": \"aggregate\",$", MR_Next},
36  {"\"repetitions\": %int,$", MR_Next},
37  {"\"threads\": 1,$", MR_Next},
38  {"\"aggregate_name\": \"BigO\",$", MR_Next},
39  {"\"aggregate_unit\": \"time\",$", MR_Next},
40  {"\"cpu_coefficient\": %float,$", MR_Next},
41  {"\"real_coefficient\": %float,$", MR_Next},
42  {"\"big_o\": \"%bigo\",$", MR_Next},
43  {"\"time_unit\": \"ns\"$", MR_Next},
44  {"}", MR_Next},
45  {"\"name\": \"%rms_name\",$"},
46  {"\"family_index\": " + std::to_string(family_index) + ",$", MR_Next},
47  {"\"per_family_instance_index\": 0,$", MR_Next},
48  {"\"run_name\": \"%name\",$", MR_Next},
49  {"\"run_type\": \"aggregate\",$", MR_Next},
50  {"\"repetitions\": %int,$", MR_Next},
51  {"\"threads\": 1,$", MR_Next},
52  {"\"aggregate_name\": \"RMS\",$", MR_Next},
53  {"\"aggregate_unit\": \"percentage\",$", MR_Next},
54  {"\"rms\": %float$", MR_Next},
55  {"}", MR_Next}});
56  AddCases(TC_CSVOut, {{"^\"%bigo_name\",,%float,%float,%bigo,,,,,$"},
57  {"^\"%bigo_name\"", MR_Not},
58  {"^\"%rms_name\",,%float,%float,,,,,,$", MR_Next}});
59  return 0;
60 }
61 
62 } // end namespace
63 
64 // ========================================================================= //
65 // --------------------------- Testing BigO O(1) --------------------------- //
66 // ========================================================================= //
67 
69  for (auto _ : state) {
70  for (int i = 0; i < 1024; ++i) {
72  }
73  }
74  state.SetComplexityN(state.range(0));
75 }
76 BENCHMARK(BM_Complexity_O1)->Range(1, 1 << 18)->Complexity(benchmark::o1);
77 BENCHMARK(BM_Complexity_O1)->Range(1, 1 << 18)->Complexity();
79  ->Range(1, 1 << 18)
80  ->Complexity([](benchmark::IterationCount) { return 1.0; });
81 
82 const char *one_test_name = "BM_Complexity_O1";
83 const char *big_o_1_test_name = "BM_Complexity_O1_BigO";
84 const char *rms_o_1_test_name = "BM_Complexity_O1_RMS";
85 const char *enum_big_o_1 = "\\([0-9]+\\)";
86 // FIXME: Tolerate both '(1)' and 'lgN' as output when the complexity is auto
87 // deduced.
88 // See https://github.com/google/benchmark/issues/272
89 const char *auto_big_o_1 = "(\\([0-9]+\\))|(lgN)";
90 const char *lambda_big_o_1 = "f\\(N\\)";
91 
92 // Add enum tests
94  enum_big_o_1, /*family_index=*/0);
95 
96 // Add auto enum tests
98  auto_big_o_1, /*family_index=*/1);
99 
100 // Add lambda tests
102  lambda_big_o_1, /*family_index=*/2);
103 
104 // ========================================================================= //
105 // --------------------------- Testing BigO O(N) --------------------------- //
106 // ========================================================================= //
107 
108 std::vector<int> ConstructRandomVector(int64_t size) {
109  std::vector<int> v;
110  v.reserve(static_cast<int>(size));
111  for (int i = 0; i < size; ++i) {
112  v.push_back(static_cast<int>(std::rand() % size));
113  }
114  return v;
115 }
116 
118  auto v = ConstructRandomVector(state.range(0));
119  // Test worst case scenario (item not in vector)
120  const int64_t item_not_in_vector = state.range(0) * 2;
121  for (auto _ : state) {
122  benchmark::DoNotOptimize(std::find(v.begin(), v.end(), item_not_in_vector));
123  }
124  state.SetComplexityN(state.range(0));
125 }
127  ->RangeMultiplier(2)
128  ->Range(1 << 10, 1 << 16)
129  ->Complexity(benchmark::oN);
131  ->RangeMultiplier(2)
132  ->Range(1 << 10, 1 << 16)
133  ->Complexity([](benchmark::IterationCount n) -> double {
134  return static_cast<double>(n);
135  });
137  ->RangeMultiplier(2)
138  ->Range(1 << 10, 1 << 16)
139  ->Complexity();
140 
141 const char *n_test_name = "BM_Complexity_O_N";
142 const char *big_o_n_test_name = "BM_Complexity_O_N_BigO";
143 const char *rms_o_n_test_name = "BM_Complexity_O_N_RMS";
144 const char *enum_auto_big_o_n = "N";
145 const char *lambda_big_o_n = "f\\(N\\)";
146 
147 // Add enum tests
149  enum_auto_big_o_n, /*family_index=*/3);
150 
151 // Add lambda tests
153  lambda_big_o_n, /*family_index=*/4);
154 
155 // ========================================================================= //
156 // ------------------------- Testing BigO O(N*lgN) ------------------------- //
157 // ========================================================================= //
158 
160  auto v = ConstructRandomVector(state.range(0));
161  for (auto _ : state) {
162  std::sort(v.begin(), v.end());
163  }
164  state.SetComplexityN(state.range(0));
165 }
166 static const double kLog2E = 1.44269504088896340736;
168  ->RangeMultiplier(2)
169  ->Range(1 << 10, 1 << 16)
170  ->Complexity(benchmark::oNLogN);
172  ->RangeMultiplier(2)
173  ->Range(1 << 10, 1 << 16)
174  ->Complexity([](benchmark::IterationCount n) {
175  return kLog2E * n * log(static_cast<double>(n));
176  });
178  ->RangeMultiplier(2)
179  ->Range(1 << 10, 1 << 16)
180  ->Complexity();
181 
182 const char *n_lg_n_test_name = "BM_Complexity_O_N_log_N";
183 const char *big_o_n_lg_n_test_name = "BM_Complexity_O_N_log_N_BigO";
184 const char *rms_o_n_lg_n_test_name = "BM_Complexity_O_N_log_N_RMS";
185 const char *enum_auto_big_o_n_lg_n = "NlgN";
186 const char *lambda_big_o_n_lg_n = "f\\(N\\)";
187 
188 // Add enum tests
191  /*family_index=*/6);
192 
193 // Add lambda tests
196  /*family_index=*/7);
197 
198 // ========================================================================= //
199 // -------- Testing formatting of Complexity with captured args ------------ //
200 // ========================================================================= //
201 
203  for (auto _ : state) {
204  // This test requires a non-zero CPU time to avoid divide-by-zero
205  benchmark::DoNotOptimize(state.iterations());
206  }
207  state.SetComplexityN(n);
208 }
209 
210 BENCHMARK_CAPTURE(BM_ComplexityCaptureArgs, capture_test, 100)
211  ->Complexity(benchmark::oN)
212  ->Ranges({{1, 2}, {3, 4}});
213 
215  "BM_ComplexityCaptureArgs/capture_test";
216 
218  complexity_capture_name + "_RMS", "N", /*family_index=*/9);
219 
220 // ========================================================================= //
221 // --------------------------- TEST CASES END ------------------------------ //
222 // ========================================================================= //
223 
224 int main(int argc, char *argv[]) { RunOutputTests(argc, argv); }
big_o_1_test_name
const char * big_o_1_test_name
Definition: benchmark/test/complexity_test.cc:83
find
static void ** find(grpc_chttp2_stream_map *map, uint32_t key)
Definition: stream_map.cc:99
ADD_COMPLEXITY_CASES
#define ADD_COMPLEXITY_CASES(...)
Definition: benchmark/test/complexity_test.cc:12
complexity_capture_name
const std::string complexity_capture_name
Definition: benchmark/test/complexity_test.cc:214
auto_big_o_1
const char * auto_big_o_1
Definition: benchmark/test/complexity_test.cc:89
MR_Next
@ MR_Next
Definition: benchmark/test/output_test.h:26
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
MR_Not
@ MR_Not
Definition: benchmark/test/output_test.h:27
BM_Complexity_O1
void BM_Complexity_O1(benchmark::State &state)
Definition: benchmark/test/complexity_test.cc:68
benchmark::DoNotOptimize
BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const &value)
Definition: benchmark/include/benchmark/benchmark.h:375
TC_CSVOut
@ TC_CSVOut
Definition: benchmark/test/output_test.h:45
BENCHMARK
BENCHMARK(BM_Complexity_O1) -> Range(1, 1<< 18) ->Complexity(benchmark::o1)
Definition: bloaty/third_party/protobuf/third_party/benchmark/test/complexity_test.cc:58
big_o_n_test_name
const char * big_o_n_test_name
Definition: benchmark/test/complexity_test.cc:142
TC_JSONOut
@ TC_JSONOut
Definition: benchmark/test/output_test.h:43
output_test.h
kLog2E
static const double kLog2E
Definition: benchmark/test/complexity_test.cc:166
SetSubstitutions
int SetSubstitutions(std::initializer_list< std::pair< std::string, std::string >> il)
Definition: benchmark/test/output_test_helper.cc:367
lambda_big_o_n_lg_n
const char * lambda_big_o_n_lg_n
Definition: benchmark/test/complexity_test.cc:186
main
int main(int argc, char *argv[])
Definition: benchmark/test/complexity_test.cc:224
n_test_name
const char * n_test_name
Definition: benchmark/test/complexity_test.cc:141
one_test_name
const char * one_test_name
Definition: benchmark/test/complexity_test.cc:82
BM_Complexity_O_N_log_N
static void BM_Complexity_O_N_log_N(benchmark::State &state)
Definition: benchmark/test/complexity_test.cc:159
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
benchmark::IterationCount
uint64_t IterationCount
Definition: benchmark/include/benchmark/benchmark.h:451
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
gmock_output_test._
_
Definition: bloaty/third_party/googletest/googlemock/test/gmock_output_test.py:175
enum_auto_big_o_n_lg_n
const char * enum_auto_big_o_n_lg_n
Definition: benchmark/test/complexity_test.cc:185
benchmark::oN
@ oN
Definition: benchmark/include/benchmark/benchmark.h:449
enum_auto_big_o_n
const char * enum_auto_big_o_n
Definition: benchmark/test/complexity_test.cc:144
AddCases
int AddCases(TestCaseID ID, std::initializer_list< TestCase > il)
Definition: benchmark/test/output_test_helper.cc:361
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
enum_big_o_1
const char * enum_big_o_1
Definition: benchmark/test/complexity_test.cc:85
BM_Complexity_O_N
void BM_Complexity_O_N(benchmark::State &state)
Definition: benchmark/test/complexity_test.cc:117
TC_ConsoleOut
@ TC_ConsoleOut
Definition: benchmark/test/output_test.h:41
rms_o_1_test_name
const char * rms_o_1_test_name
Definition: benchmark/test/complexity_test.cc:84
RunOutputTests
void RunOutputTests(int argc, char *argv[])
Definition: benchmark/test/output_test_helper.cc:391
lambda_big_o_n
const char * lambda_big_o_n
Definition: benchmark/test/complexity_test.cc:145
big_o_n_lg_n_test_name
const char * big_o_n_lg_n_test_name
Definition: benchmark/test/complexity_test.cc:183
benchmark::State
Definition: benchmark/include/benchmark/benchmark.h:503
rms_o_n_test_name
const char * rms_o_n_test_name
Definition: benchmark/test/complexity_test.cc:143
rms_o_n_lg_n_test_name
const char * rms_o_n_lg_n_test_name
Definition: benchmark/test/complexity_test.cc:184
state
Definition: bloaty/third_party/zlib/contrib/blast/blast.c:41
log
bool log
Definition: abseil-cpp/absl/synchronization/mutex.cc:310
lambda_big_o_1
const char * lambda_big_o_1
Definition: benchmark/test/complexity_test.cc:90
benchmark::oNLogN
@ oNLogN
Definition: benchmark/include/benchmark/benchmark.h:449
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
benchmark::o1
@ o1
Definition: benchmark/include/benchmark/benchmark.h:449
to_string
static bool to_string(zval *from)
Definition: protobuf/php/ext/google/protobuf/convert.c:333
ConstructRandomVector
std::vector< int > ConstructRandomVector(int64_t size)
Definition: benchmark/test/complexity_test.cc:108
BM_ComplexityCaptureArgs
void BM_ComplexityCaptureArgs(benchmark::State &state, int n)
Definition: benchmark/test/complexity_test.cc:202
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
n_lg_n_test_name
const char * n_lg_n_test_name
Definition: benchmark/test/complexity_test.cc:182


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:00