80 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11#include <algorithm>12#include <deque>13#include <ranges>14 15#include "benchmark/benchmark.h"16 17namespace {18void 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 33void 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}46BENCHMARK(BM_join_view_in_vectors)->Apply(run_sizes);47 48void 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}61BENCHMARK(BM_join_view_out_vectors)->Apply(run_sizes);62 63void 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}76BENCHMARK(BM_join_view_deques)->Apply(run_sizes);77} // namespace78 79BENCHMARK_MAIN();80