1*4bdff4beSrobert //===----------------------------------------------------------------------===//
2*4bdff4beSrobert //
3*4bdff4beSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*4bdff4beSrobert // See https://llvm.org/LICENSE.txt for license information.
5*4bdff4beSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*4bdff4beSrobert //
7*4bdff4beSrobert //===----------------------------------------------------------------------===//
8*4bdff4beSrobert
9*4bdff4beSrobert #include <algorithm>
10*4bdff4beSrobert #include <deque>
11*4bdff4beSrobert
12*4bdff4beSrobert #include "benchmark/benchmark.h"
13*4bdff4beSrobert
14*4bdff4beSrobert namespace {
run_sizes(auto benchmark)15*4bdff4beSrobert void run_sizes(auto benchmark) {
16*4bdff4beSrobert benchmark->Arg(0)
17*4bdff4beSrobert ->Arg(1)
18*4bdff4beSrobert ->Arg(2)
19*4bdff4beSrobert ->Arg(64)
20*4bdff4beSrobert ->Arg(512)
21*4bdff4beSrobert ->Arg(1024)
22*4bdff4beSrobert ->Arg(4000)
23*4bdff4beSrobert ->Arg(4096)
24*4bdff4beSrobert ->Arg(5500)
25*4bdff4beSrobert ->Arg(64000)
26*4bdff4beSrobert ->Arg(65536)
27*4bdff4beSrobert ->Arg(70000);
28*4bdff4beSrobert }
29*4bdff4beSrobert
30*4bdff4beSrobert template <class FromContainer, class ToContainer, class Func>
benchmark_containers(benchmark::State & state,FromContainer & d,ToContainer & v,Func && func)31*4bdff4beSrobert void benchmark_containers(benchmark::State& state, FromContainer& d, ToContainer& v, Func&& func) {
32*4bdff4beSrobert for (auto _ : state) {
33*4bdff4beSrobert benchmark::DoNotOptimize(v);
34*4bdff4beSrobert benchmark::DoNotOptimize(d);
35*4bdff4beSrobert func(d.begin(), d.end(), v.begin());
36*4bdff4beSrobert }
37*4bdff4beSrobert }
38*4bdff4beSrobert
39*4bdff4beSrobert template <class Func>
benchmark_deque_vector(benchmark::State & state,Func && func)40*4bdff4beSrobert void benchmark_deque_vector(benchmark::State& state, Func&& func) {
41*4bdff4beSrobert auto size = state.range(0);
42*4bdff4beSrobert std::deque<int> d;
43*4bdff4beSrobert d.resize(size);
44*4bdff4beSrobert std::ranges::fill(d, 10);
45*4bdff4beSrobert std::vector<int> v;
46*4bdff4beSrobert v.resize(size);
47*4bdff4beSrobert benchmark_containers(state, d, v, func);
48*4bdff4beSrobert }
49*4bdff4beSrobert
50*4bdff4beSrobert template <class Func>
benchmark_deque_deque(benchmark::State & state,Func && func)51*4bdff4beSrobert void benchmark_deque_deque(benchmark::State& state, Func&& func) {
52*4bdff4beSrobert auto size = state.range(0);
53*4bdff4beSrobert std::deque<int> d;
54*4bdff4beSrobert d.resize(size);
55*4bdff4beSrobert std::ranges::fill(d, 10);
56*4bdff4beSrobert std::deque<int> v;
57*4bdff4beSrobert v.resize(size);
58*4bdff4beSrobert benchmark_containers(state, d, v, func);
59*4bdff4beSrobert }
60*4bdff4beSrobert
61*4bdff4beSrobert template <class Func>
benchmark_vector_deque(benchmark::State & state,Func && func)62*4bdff4beSrobert void benchmark_vector_deque(benchmark::State& state, Func&& func) {
63*4bdff4beSrobert auto size = state.range(0);
64*4bdff4beSrobert std::vector<int> d;
65*4bdff4beSrobert d.resize(size);
66*4bdff4beSrobert std::ranges::fill(d, 10);
67*4bdff4beSrobert std::deque<int> v;
68*4bdff4beSrobert v.resize(size);
69*4bdff4beSrobert benchmark_containers(state, d, v, func);
70*4bdff4beSrobert }
71*4bdff4beSrobert
72*4bdff4beSrobert template <class FromContainer, class ToContainer, class Func>
benchmark_containers_backward(benchmark::State & state,FromContainer & d,ToContainer & v,Func && func)73*4bdff4beSrobert void benchmark_containers_backward(benchmark::State& state, FromContainer& d, ToContainer& v, Func&& func) {
74*4bdff4beSrobert for (auto _ : state) {
75*4bdff4beSrobert benchmark::DoNotOptimize(v);
76*4bdff4beSrobert benchmark::DoNotOptimize(d);
77*4bdff4beSrobert func(d.begin(), d.end(), v.end());
78*4bdff4beSrobert }
79*4bdff4beSrobert }
80*4bdff4beSrobert
81*4bdff4beSrobert template <class Func>
benchmark_deque_vector_backward(benchmark::State & state,Func && func)82*4bdff4beSrobert void benchmark_deque_vector_backward(benchmark::State& state, Func&& func) {
83*4bdff4beSrobert auto size = state.range(0);
84*4bdff4beSrobert std::deque<int> d;
85*4bdff4beSrobert d.resize(size);
86*4bdff4beSrobert std::ranges::fill(d, 10);
87*4bdff4beSrobert std::vector<int> v;
88*4bdff4beSrobert v.resize(size);
89*4bdff4beSrobert benchmark_containers_backward(state, d, v, func);
90*4bdff4beSrobert }
91*4bdff4beSrobert
92*4bdff4beSrobert template <class Func>
benchmark_deque_deque_backward(benchmark::State & state,Func && func)93*4bdff4beSrobert void benchmark_deque_deque_backward(benchmark::State& state, Func&& func) {
94*4bdff4beSrobert auto size = state.range(0);
95*4bdff4beSrobert std::deque<int> d;
96*4bdff4beSrobert d.resize(size);
97*4bdff4beSrobert std::ranges::fill(d, 10);
98*4bdff4beSrobert std::deque<int> v;
99*4bdff4beSrobert v.resize(size);
100*4bdff4beSrobert benchmark_containers_backward(state, d, v, func);
101*4bdff4beSrobert }
102*4bdff4beSrobert
103*4bdff4beSrobert template <class Func>
benchmark_vector_deque_backward(benchmark::State & state,Func && func)104*4bdff4beSrobert void benchmark_vector_deque_backward(benchmark::State& state, Func&& func) {
105*4bdff4beSrobert auto size = state.range(0);
106*4bdff4beSrobert std::vector<int> d;
107*4bdff4beSrobert d.resize(size);
108*4bdff4beSrobert std::ranges::fill(d, 10);
109*4bdff4beSrobert std::deque<int> v;
110*4bdff4beSrobert v.resize(size);
111*4bdff4beSrobert benchmark_containers_backward(state, d, v, func);
112*4bdff4beSrobert }
113*4bdff4beSrobert
114*4bdff4beSrobert struct CopyFunctor {
115*4bdff4beSrobert template <class... Args>
operator ()__anonfa4b17880111::CopyFunctor116*4bdff4beSrobert auto operator()(Args... args) const {
117*4bdff4beSrobert std::copy(std::forward<Args>(args)...);
118*4bdff4beSrobert }
119*4bdff4beSrobert } copy;
120*4bdff4beSrobert
121*4bdff4beSrobert struct MoveFunctor {
122*4bdff4beSrobert template <class... Args>
operator ()__anonfa4b17880111::MoveFunctor123*4bdff4beSrobert auto operator()(Args... args) const {
124*4bdff4beSrobert std::move(std::forward<Args>(args)...);
125*4bdff4beSrobert }
126*4bdff4beSrobert } move;
127*4bdff4beSrobert
128*4bdff4beSrobert struct CopyBackwardFunctor {
129*4bdff4beSrobert template <class... Args>
operator ()__anonfa4b17880111::CopyBackwardFunctor130*4bdff4beSrobert auto operator()(Args... args) const {
131*4bdff4beSrobert std::copy_backward(std::forward<Args>(args)...);
132*4bdff4beSrobert }
133*4bdff4beSrobert } copy_backward;
134*4bdff4beSrobert
135*4bdff4beSrobert struct MoveBackwardFunctor {
136*4bdff4beSrobert template <class... Args>
operator ()__anonfa4b17880111::MoveBackwardFunctor137*4bdff4beSrobert auto operator()(Args... args) const {
138*4bdff4beSrobert std::move_backward(std::forward<Args>(args)...);
139*4bdff4beSrobert }
140*4bdff4beSrobert } move_backward;
141*4bdff4beSrobert
142*4bdff4beSrobert // copy
BM_deque_vector_copy(benchmark::State & state)143*4bdff4beSrobert void BM_deque_vector_copy(benchmark::State& state) { benchmark_deque_vector(state, copy); }
144*4bdff4beSrobert BENCHMARK(BM_deque_vector_copy)->Apply(run_sizes);
145*4bdff4beSrobert
BM_deque_vector_ranges_copy(benchmark::State & state)146*4bdff4beSrobert void BM_deque_vector_ranges_copy(benchmark::State& state) { benchmark_deque_vector(state, std::ranges::copy); }
147*4bdff4beSrobert BENCHMARK(BM_deque_vector_ranges_copy)->Apply(run_sizes);
148*4bdff4beSrobert
BM_deque_deque_copy(benchmark::State & state)149*4bdff4beSrobert void BM_deque_deque_copy(benchmark::State& state) { benchmark_deque_deque(state, copy); }
150*4bdff4beSrobert BENCHMARK(BM_deque_deque_copy)->Apply(run_sizes);
151*4bdff4beSrobert
BM_deque_deque_ranges_copy(benchmark::State & state)152*4bdff4beSrobert void BM_deque_deque_ranges_copy(benchmark::State& state) { benchmark_deque_deque(state, std::ranges::copy); }
153*4bdff4beSrobert BENCHMARK(BM_deque_deque_ranges_copy)->Apply(run_sizes);
154*4bdff4beSrobert
BM_vector_deque_copy(benchmark::State & state)155*4bdff4beSrobert void BM_vector_deque_copy(benchmark::State& state) { benchmark_vector_deque(state, copy); }
156*4bdff4beSrobert BENCHMARK(BM_vector_deque_copy)->Apply(run_sizes);
157*4bdff4beSrobert
BM_vector_deque_ranges_copy(benchmark::State & state)158*4bdff4beSrobert void BM_vector_deque_ranges_copy(benchmark::State& state) { benchmark_vector_deque(state, std::ranges::copy); }
159*4bdff4beSrobert BENCHMARK(BM_vector_deque_ranges_copy)->Apply(run_sizes);
160*4bdff4beSrobert
161*4bdff4beSrobert // move
BM_deque_vector_move(benchmark::State & state)162*4bdff4beSrobert void BM_deque_vector_move(benchmark::State& state) { benchmark_deque_vector(state, move); }
163*4bdff4beSrobert BENCHMARK(BM_deque_vector_move)->Apply(run_sizes);
164*4bdff4beSrobert
BM_deque_vector_ranges_move(benchmark::State & state)165*4bdff4beSrobert void BM_deque_vector_ranges_move(benchmark::State& state) { benchmark_deque_vector(state, std::ranges::move); }
166*4bdff4beSrobert BENCHMARK(BM_deque_vector_ranges_move)->Apply(run_sizes);
167*4bdff4beSrobert
BM_deque_deque_move(benchmark::State & state)168*4bdff4beSrobert void BM_deque_deque_move(benchmark::State& state) { benchmark_deque_deque(state, move); }
169*4bdff4beSrobert BENCHMARK(BM_deque_deque_move)->Apply(run_sizes);
170*4bdff4beSrobert
BM_deque_deque_ranges_move(benchmark::State & state)171*4bdff4beSrobert void BM_deque_deque_ranges_move(benchmark::State& state) { benchmark_deque_deque(state, std::ranges::move); }
172*4bdff4beSrobert BENCHMARK(BM_deque_deque_ranges_move)->Apply(run_sizes);
173*4bdff4beSrobert
BM_vector_deque_move(benchmark::State & state)174*4bdff4beSrobert void BM_vector_deque_move(benchmark::State& state) { benchmark_vector_deque(state, move); }
175*4bdff4beSrobert BENCHMARK(BM_vector_deque_move)->Apply(run_sizes);
176*4bdff4beSrobert
BM_vector_deque_ranges_move(benchmark::State & state)177*4bdff4beSrobert void BM_vector_deque_ranges_move(benchmark::State& state) { benchmark_vector_deque(state, std::ranges::move); }
178*4bdff4beSrobert BENCHMARK(BM_vector_deque_ranges_move)->Apply(run_sizes);
179*4bdff4beSrobert
180*4bdff4beSrobert // copy_backward
BM_deque_vector_copy_backward(benchmark::State & state)181*4bdff4beSrobert void BM_deque_vector_copy_backward(benchmark::State& state) { benchmark_deque_vector_backward(state, copy_backward); }
182*4bdff4beSrobert BENCHMARK(BM_deque_vector_copy_backward)->Apply(run_sizes);
183*4bdff4beSrobert
BM_deque_vector_ranges_copy_backward(benchmark::State & state)184*4bdff4beSrobert void BM_deque_vector_ranges_copy_backward(benchmark::State& state) {
185*4bdff4beSrobert benchmark_deque_vector_backward(state, std::ranges::copy_backward);
186*4bdff4beSrobert }
187*4bdff4beSrobert BENCHMARK(BM_deque_vector_ranges_copy_backward)->Apply(run_sizes);
188*4bdff4beSrobert
BM_deque_deque_copy_backward(benchmark::State & state)189*4bdff4beSrobert void BM_deque_deque_copy_backward(benchmark::State& state) { benchmark_deque_deque_backward(state, copy_backward); }
190*4bdff4beSrobert BENCHMARK(BM_deque_deque_copy_backward)->Apply(run_sizes);
191*4bdff4beSrobert
BM_deque_deque_ranges_copy_backward(benchmark::State & state)192*4bdff4beSrobert void BM_deque_deque_ranges_copy_backward(benchmark::State& state) {
193*4bdff4beSrobert benchmark_deque_deque_backward(state, std::ranges::copy_backward);
194*4bdff4beSrobert }
195*4bdff4beSrobert BENCHMARK(BM_deque_deque_ranges_copy_backward)->Apply(run_sizes);
196*4bdff4beSrobert
BM_vector_deque_copy_backward(benchmark::State & state)197*4bdff4beSrobert void BM_vector_deque_copy_backward(benchmark::State& state) { benchmark_vector_deque_backward(state, copy_backward); }
198*4bdff4beSrobert BENCHMARK(BM_vector_deque_copy_backward)->Apply(run_sizes);
199*4bdff4beSrobert
BM_vector_deque_ranges_copy_backward(benchmark::State & state)200*4bdff4beSrobert void BM_vector_deque_ranges_copy_backward(benchmark::State& state) {
201*4bdff4beSrobert benchmark_vector_deque_backward(state, std::ranges::copy_backward);
202*4bdff4beSrobert }
203*4bdff4beSrobert BENCHMARK(BM_vector_deque_ranges_copy_backward)->Apply(run_sizes);
204*4bdff4beSrobert
205*4bdff4beSrobert // move_backward
BM_deque_vector_move_backward(benchmark::State & state)206*4bdff4beSrobert void BM_deque_vector_move_backward(benchmark::State& state) { benchmark_deque_vector_backward(state, move_backward); }
207*4bdff4beSrobert BENCHMARK(BM_deque_vector_move_backward)->Apply(run_sizes);
208*4bdff4beSrobert
BM_deque_vector_ranges_move_backward(benchmark::State & state)209*4bdff4beSrobert void BM_deque_vector_ranges_move_backward(benchmark::State& state) {
210*4bdff4beSrobert benchmark_deque_vector_backward(state, std::ranges::move_backward);
211*4bdff4beSrobert }
212*4bdff4beSrobert BENCHMARK(BM_deque_vector_ranges_move_backward)->Apply(run_sizes);
213*4bdff4beSrobert
BM_deque_deque_move_backward(benchmark::State & state)214*4bdff4beSrobert void BM_deque_deque_move_backward(benchmark::State& state) { benchmark_deque_deque_backward(state, move_backward); }
215*4bdff4beSrobert BENCHMARK(BM_deque_deque_move_backward)->Apply(run_sizes);
216*4bdff4beSrobert
BM_deque_deque_ranges_move_backward(benchmark::State & state)217*4bdff4beSrobert void BM_deque_deque_ranges_move_backward(benchmark::State& state) {
218*4bdff4beSrobert benchmark_deque_deque_backward(state, std::ranges::move_backward);
219*4bdff4beSrobert }
220*4bdff4beSrobert BENCHMARK(BM_deque_deque_ranges_move_backward)->Apply(run_sizes);
221*4bdff4beSrobert
BM_vector_deque_move_backward(benchmark::State & state)222*4bdff4beSrobert void BM_vector_deque_move_backward(benchmark::State& state) { benchmark_vector_deque_backward(state, move_backward); }
223*4bdff4beSrobert BENCHMARK(BM_vector_deque_move_backward)->Apply(run_sizes);
224*4bdff4beSrobert
BM_vector_deque_ranges_move_backward(benchmark::State & state)225*4bdff4beSrobert void BM_vector_deque_ranges_move_backward(benchmark::State& state) {
226*4bdff4beSrobert benchmark_vector_deque_backward(state, std::ranges::move_backward);
227*4bdff4beSrobert }
228*4bdff4beSrobert BENCHMARK(BM_vector_deque_ranges_move_backward)->Apply(run_sizes);
229*4bdff4beSrobert
230*4bdff4beSrobert } // namespace
231*4bdff4beSrobert
232*4bdff4beSrobert BENCHMARK_MAIN();
233