xref: /llvm-project/libcxx/test/benchmarks/join_view.bench.cpp (revision b2d2494731976ab7aa9702f3134472db694b9332)
178b4b5ccSLouis Dionne //===----------------------------------------------------------------------===//
278b4b5ccSLouis Dionne //
378b4b5ccSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
478b4b5ccSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
578b4b5ccSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
678b4b5ccSLouis Dionne //
778b4b5ccSLouis Dionne //===----------------------------------------------------------------------===//
878b4b5ccSLouis Dionne 
9*b2d24947SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10*b2d24947SLouis Dionne 
1178b4b5ccSLouis Dionne #include <algorithm>
1278b4b5ccSLouis Dionne #include <deque>
1378b4b5ccSLouis Dionne #include <ranges>
1478b4b5ccSLouis Dionne 
1578b4b5ccSLouis Dionne #include "benchmark/benchmark.h"
1678b4b5ccSLouis Dionne 
1778b4b5ccSLouis Dionne namespace {
1878b4b5ccSLouis Dionne void run_sizes(auto benchmark) {
1978b4b5ccSLouis Dionne   benchmark->Arg(0)
2078b4b5ccSLouis Dionne       ->Arg(1)
2178b4b5ccSLouis Dionne       ->Arg(2)
2278b4b5ccSLouis Dionne       ->Arg(64)
2378b4b5ccSLouis Dionne       ->Arg(512)
2478b4b5ccSLouis Dionne       ->Arg(1024)
2578b4b5ccSLouis Dionne       ->Arg(4000)
2678b4b5ccSLouis Dionne       ->Arg(4096)
2778b4b5ccSLouis Dionne       ->Arg(5500)
2878b4b5ccSLouis Dionne       ->Arg(64000)
2978b4b5ccSLouis Dionne       ->Arg(65536)
3078b4b5ccSLouis Dionne       ->Arg(70000);
3178b4b5ccSLouis Dionne }
3278b4b5ccSLouis Dionne 
3378b4b5ccSLouis Dionne void BM_join_view_in_vectors(benchmark::State& state) {
3478b4b5ccSLouis Dionne   auto size = state.range(0);
3578b4b5ccSLouis Dionne   std::vector<std::vector<int>> input(size, std::vector<int>(32));
3678b4b5ccSLouis Dionne   std::ranges::fill(input | std::views::join, 10);
3778b4b5ccSLouis Dionne   std::vector<int> output;
3878b4b5ccSLouis Dionne   output.resize(size * 32);
3978b4b5ccSLouis Dionne 
4078b4b5ccSLouis Dionne   for (auto _ : state) {
4178b4b5ccSLouis Dionne     benchmark::DoNotOptimize(input);
4278b4b5ccSLouis Dionne     benchmark::DoNotOptimize(output);
4378b4b5ccSLouis Dionne     std::ranges::copy(input | std::views::join, output.begin());
4478b4b5ccSLouis Dionne   }
4578b4b5ccSLouis Dionne }
4678b4b5ccSLouis Dionne BENCHMARK(BM_join_view_in_vectors)->Apply(run_sizes);
4778b4b5ccSLouis Dionne 
4878b4b5ccSLouis Dionne void BM_join_view_out_vectors(benchmark::State& state) {
4978b4b5ccSLouis Dionne   auto size = state.range(0);
5078b4b5ccSLouis Dionne   std::vector<std::vector<int>> output(size, std::vector<int>(32));
5178b4b5ccSLouis Dionne   std::vector<int> input;
5278b4b5ccSLouis Dionne   input.resize(size * 32);
5378b4b5ccSLouis Dionne   std::ranges::fill(input, 10);
5478b4b5ccSLouis Dionne 
5578b4b5ccSLouis Dionne   for (auto _ : state) {
5678b4b5ccSLouis Dionne     benchmark::DoNotOptimize(output);
5778b4b5ccSLouis Dionne     benchmark::DoNotOptimize(input);
5878b4b5ccSLouis Dionne     std::ranges::copy(input, (output | std::views::join).begin());
5978b4b5ccSLouis Dionne   }
6078b4b5ccSLouis Dionne }
6178b4b5ccSLouis Dionne BENCHMARK(BM_join_view_out_vectors)->Apply(run_sizes);
6278b4b5ccSLouis Dionne 
6378b4b5ccSLouis Dionne void BM_join_view_deques(benchmark::State& state) {
6478b4b5ccSLouis Dionne   auto size = state.range(0);
6578b4b5ccSLouis Dionne   std::deque<std::deque<int>> deque(size, std::deque<int>(32));
6678b4b5ccSLouis Dionne   std::ranges::fill(deque | std::views::join, 10);
6778b4b5ccSLouis Dionne   std::vector<int> output;
6878b4b5ccSLouis Dionne   output.resize(size * 32);
6978b4b5ccSLouis Dionne 
7078b4b5ccSLouis Dionne   for (auto _ : state) {
7178b4b5ccSLouis Dionne     benchmark::DoNotOptimize(deque);
7278b4b5ccSLouis Dionne     benchmark::DoNotOptimize(output);
7378b4b5ccSLouis Dionne     std::ranges::copy(deque | std::views::join, output.begin());
7478b4b5ccSLouis Dionne   }
7578b4b5ccSLouis Dionne }
7678b4b5ccSLouis Dionne BENCHMARK(BM_join_view_deques)->Apply(run_sizes);
7778b4b5ccSLouis Dionne } // namespace
7878b4b5ccSLouis Dionne 
7978b4b5ccSLouis Dionne BENCHMARK_MAIN();
80