xref: /openbsd-src/gnu/llvm/libcxx/benchmarks/join_view.bench.cpp (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
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 #include <ranges>
12*4bdff4beSrobert 
13*4bdff4beSrobert #include "benchmark/benchmark.h"
14*4bdff4beSrobert 
15*4bdff4beSrobert namespace {
run_sizes(auto benchmark)16*4bdff4beSrobert void run_sizes(auto benchmark) {
17*4bdff4beSrobert   benchmark->Arg(0)
18*4bdff4beSrobert       ->Arg(1)
19*4bdff4beSrobert       ->Arg(2)
20*4bdff4beSrobert       ->Arg(64)
21*4bdff4beSrobert       ->Arg(512)
22*4bdff4beSrobert       ->Arg(1024)
23*4bdff4beSrobert       ->Arg(4000)
24*4bdff4beSrobert       ->Arg(4096)
25*4bdff4beSrobert       ->Arg(5500)
26*4bdff4beSrobert       ->Arg(64000)
27*4bdff4beSrobert       ->Arg(65536)
28*4bdff4beSrobert       ->Arg(70000);
29*4bdff4beSrobert }
30*4bdff4beSrobert 
BM_join_view_in_vectors(benchmark::State & state)31*4bdff4beSrobert void BM_join_view_in_vectors(benchmark::State& state) {
32*4bdff4beSrobert   auto size = state.range(0);
33*4bdff4beSrobert   std::vector<std::vector<int>> input(size, std::vector<int>(32));
34*4bdff4beSrobert   std::ranges::fill(input | std::views::join, 10);
35*4bdff4beSrobert   std::vector<int> output;
36*4bdff4beSrobert   output.resize(size * 32);
37*4bdff4beSrobert 
38*4bdff4beSrobert   for (auto _ : state) {
39*4bdff4beSrobert     benchmark::DoNotOptimize(input);
40*4bdff4beSrobert     benchmark::DoNotOptimize(output);
41*4bdff4beSrobert     std::ranges::copy(input | std::views::join, output.begin());
42*4bdff4beSrobert   }
43*4bdff4beSrobert }
44*4bdff4beSrobert BENCHMARK(BM_join_view_in_vectors)->Apply(run_sizes);
45*4bdff4beSrobert 
BM_join_view_out_vectors(benchmark::State & state)46*4bdff4beSrobert void BM_join_view_out_vectors(benchmark::State& state) {
47*4bdff4beSrobert   auto size = state.range(0);
48*4bdff4beSrobert   std::vector<std::vector<int>> output(size, std::vector<int>(32));
49*4bdff4beSrobert   std::vector<int> input;
50*4bdff4beSrobert   input.resize(size * 32);
51*4bdff4beSrobert   std::ranges::fill(input, 10);
52*4bdff4beSrobert 
53*4bdff4beSrobert   for (auto _ : state) {
54*4bdff4beSrobert     benchmark::DoNotOptimize(output);
55*4bdff4beSrobert     benchmark::DoNotOptimize(input);
56*4bdff4beSrobert     std::ranges::copy(input, (output | std::views::join).begin());
57*4bdff4beSrobert   }
58*4bdff4beSrobert }
59*4bdff4beSrobert BENCHMARK(BM_join_view_out_vectors)->Apply(run_sizes);
60*4bdff4beSrobert 
BM_join_view_deques(benchmark::State & state)61*4bdff4beSrobert void BM_join_view_deques(benchmark::State& state) {
62*4bdff4beSrobert   auto size = state.range(0);
63*4bdff4beSrobert   std::deque<std::deque<int>> deque(size, std::deque<int>(32));
64*4bdff4beSrobert   std::ranges::fill(deque | std::views::join, 10);
65*4bdff4beSrobert   std::vector<int> output;
66*4bdff4beSrobert   output.resize(size * 32);
67*4bdff4beSrobert 
68*4bdff4beSrobert   for (auto _ : state) {
69*4bdff4beSrobert     benchmark::DoNotOptimize(deque);
70*4bdff4beSrobert     benchmark::DoNotOptimize(output);
71*4bdff4beSrobert     std::ranges::copy(deque | std::views::join, output.begin());
72*4bdff4beSrobert   }
73*4bdff4beSrobert }
74*4bdff4beSrobert BENCHMARK(BM_join_view_deques)->Apply(run_sizes);
75*4bdff4beSrobert } // namespace
76*4bdff4beSrobert 
77*4bdff4beSrobert BENCHMARK_MAIN();
78