10
10
#ifndef TEST_BENCHMARKS_CONTAINERS_CONTAINER_BENCHMARKS_H
11
11
#define TEST_BENCHMARKS_CONTAINERS_CONTAINER_BENCHMARKS_H
12
12
13
+ #include < algorithm>
13
14
#include < cstddef>
14
15
#include < iterator>
15
16
#include < ranges> // for std::from_range
19
20
#include " benchmark/benchmark.h"
20
21
#include " test_iterators.h"
21
22
#include " test_macros.h"
23
+ #include " ../GenerateInput.h"
22
24
23
25
namespace ContainerBenchmarks {
24
26
@@ -47,11 +49,11 @@ void BM_ctor_size(benchmark::State& st) {
47
49
}
48
50
}
49
51
50
- template <class Container >
51
- void BM_ctor_size_value (benchmark::State& st) {
52
+ template <class Container , class Generator >
53
+ void BM_ctor_size_value (benchmark::State& st, Generator gen ) {
52
54
using ValueType = typename Container::value_type;
53
55
const auto size = st.range (0 );
54
- ValueType value{} ;
56
+ ValueType value = gen () ;
55
57
benchmark::DoNotOptimize (value);
56
58
char buffer[sizeof (Container)];
57
59
for (auto _ : st) {
@@ -63,11 +65,12 @@ void BM_ctor_size_value(benchmark::State& st) {
63
65
}
64
66
}
65
67
66
- template <class Container >
67
- void BM_ctor_iter_iter (benchmark::State& st) {
68
+ template <class Container , class Generator >
69
+ void BM_ctor_iter_iter (benchmark::State& st, Generator gen ) {
68
70
using ValueType = typename Container::value_type;
69
71
const auto size = st.range (0 );
70
- std::vector<ValueType> in (size);
72
+ std::vector<ValueType> in;
73
+ std::generate_n (std::back_inserter (in), size, gen);
71
74
const auto begin = in.begin ();
72
75
const auto end = in.end ();
73
76
benchmark::DoNotOptimize (in);
@@ -283,10 +286,24 @@ void BM_erase_middle(benchmark::State& st) {
283
286
284
287
template <class Container >
285
288
void sequence_container_benchmarks (std::string container) {
289
+ using ValueType = typename Container::value_type;
290
+ auto cheap = [] { return Generate<ValueType>::cheap (); };
291
+ auto expensive = [] { return Generate<ValueType>::expensive (); };
292
+
286
293
// constructors
287
294
benchmark::RegisterBenchmark (container + " ::ctor(size)" , BM_ctor_size<Container>)->Arg (1024 );
288
- benchmark::RegisterBenchmark (container + " ::ctor(size, value_type)" , BM_ctor_size_value<Container>)->Arg (1024 );
289
- benchmark::RegisterBenchmark (container + " ::ctor(Iterator, Iterator)" , BM_ctor_iter_iter<Container>)->Arg (1024 );
295
+ benchmark::RegisterBenchmark (container + " ::ctor(size, value_type) (cheap elements)" , [=](auto & st) {
296
+ BM_ctor_size_value<Container>(st, cheap);
297
+ })->Arg (1024 );
298
+ benchmark::RegisterBenchmark (container + " ::ctor(size, value_type) (expensive elements)" , [=](auto & st) {
299
+ BM_ctor_size_value<Container>(st, expensive);
300
+ })->Arg (1024 );
301
+ benchmark::RegisterBenchmark (container + " ::ctor(Iterator, Iterator) (cheap elements)" , [=](auto & st) {
302
+ BM_ctor_iter_iter<Container>(st, cheap);
303
+ })->Arg (1024 );
304
+ benchmark::RegisterBenchmark (container + " ::ctor(Iterator, Iterator) (expensive elements)" , [=](auto & st) {
305
+ BM_ctor_iter_iter<Container>(st, expensive);
306
+ })->Arg (1024 );
290
307
#if TEST_STD_VER >= 23
291
308
benchmark::RegisterBenchmark (container + " ::ctor(Range)" , BM_ctor_from_range<Container>)->Arg (1024 );
292
309
#endif
0 commit comments