• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03, c++11, c++14, c++17
10 
11 #include <algorithm>
12 #include <deque>
13 #include <ranges>
14 
15 #include "benchmark/benchmark.h"
16 
17 namespace {
run_sizes(auto benchmark)18 void run_sizes(auto benchmark) {
19   benchmark->Arg(0)
20       ->Arg(1)
21       ->Arg(2)
22       ->Arg(64)
23       ->Arg(512)
24       ->Arg(1024)
25       ->Arg(4000)
26       ->Arg(4096)
27       ->Arg(5500)
28       ->Arg(64000)
29       ->Arg(65536)
30       ->Arg(70000);
31 }
32 
BM_join_view_in_vectors(benchmark::State & state)33 void BM_join_view_in_vectors(benchmark::State& state) {
34   auto size = state.range(0);
35   std::vector<std::vector<int>> input(size, std::vector<int>(32));
36   std::ranges::fill(input | std::views::join, 10);
37   std::vector<int> output;
38   output.resize(size * 32);
39 
40   for (auto _ : state) {
41     benchmark::DoNotOptimize(input);
42     benchmark::DoNotOptimize(output);
43     std::ranges::copy(input | std::views::join, output.begin());
44   }
45 }
46 BENCHMARK(BM_join_view_in_vectors)->Apply(run_sizes);
47 
BM_join_view_out_vectors(benchmark::State & state)48 void BM_join_view_out_vectors(benchmark::State& state) {
49   auto size = state.range(0);
50   std::vector<std::vector<int>> output(size, std::vector<int>(32));
51   std::vector<int> input;
52   input.resize(size * 32);
53   std::ranges::fill(input, 10);
54 
55   for (auto _ : state) {
56     benchmark::DoNotOptimize(output);
57     benchmark::DoNotOptimize(input);
58     std::ranges::copy(input, (output | std::views::join).begin());
59   }
60 }
61 BENCHMARK(BM_join_view_out_vectors)->Apply(run_sizes);
62 
BM_join_view_deques(benchmark::State & state)63 void BM_join_view_deques(benchmark::State& state) {
64   auto size = state.range(0);
65   std::deque<std::deque<int>> deque(size, std::deque<int>(32));
66   std::ranges::fill(deque | std::views::join, 10);
67   std::vector<int> output;
68   output.resize(size * 32);
69 
70   for (auto _ : state) {
71     benchmark::DoNotOptimize(deque);
72     benchmark::DoNotOptimize(output);
73     std::ranges::copy(deque | std::views::join, output.begin());
74   }
75 }
76 BENCHMARK(BM_join_view_deques)->Apply(run_sizes);
77 } // namespace
78 
79 BENCHMARK_MAIN();
80