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