1010#ifndef TEST_BENCHMARKS_CONTAINERS_CONTAINER_BENCHMARKS_H
1111#define TEST_BENCHMARKS_CONTAINERS_CONTAINER_BENCHMARKS_H
1212
13+ #include < algorithm>
1314#include < cstddef>
1415#include < iterator>
1516#include < ranges> // for std::from_range
1920#include " benchmark/benchmark.h"
2021#include " test_iterators.h"
2122#include " test_macros.h"
23+ #include " ../GenerateInput.h"
2224
2325namespace ContainerBenchmarks {
2426
@@ -47,11 +49,11 @@ void BM_ctor_size(benchmark::State& st) {
4749 }
4850}
4951
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 ) {
5254 using ValueType = typename Container::value_type;
5355 const auto size = st.range (0 );
54- ValueType value{} ;
56+ ValueType value = gen () ;
5557 benchmark::DoNotOptimize (value);
5658 char buffer[sizeof (Container)];
5759 for (auto _ : st) {
@@ -63,11 +65,12 @@ void BM_ctor_size_value(benchmark::State& st) {
6365 }
6466}
6567
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 ) {
6870 using ValueType = typename Container::value_type;
6971 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);
7174 const auto begin = in.begin ();
7275 const auto end = in.end ();
7376 benchmark::DoNotOptimize (in);
@@ -283,10 +286,24 @@ void BM_erase_middle(benchmark::State& st) {
283286
284287template <class Container >
285288void 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+
286293 // constructors
287294 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 );
290307#if TEST_STD_VER >= 23
291308 benchmark::RegisterBenchmark (container + " ::ctor(Range)" , BM_ctor_from_range<Container>)->Arg (1024 );
292309#endif
0 commit comments