67 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 <benchmark/benchmark.h>13#include <vector>14 15static void bm_ranges_swap_ranges_vb_aligned(benchmark::State& state) {16 auto n = state.range();17 std::vector<bool> vec1(n, true);18 std::vector<bool> vec2(n, false);19 for (auto _ : state) {20 benchmark::DoNotOptimize(std::ranges::swap_ranges(vec1, vec2));21 benchmark::DoNotOptimize(&vec1);22 benchmark::DoNotOptimize(&vec2);23 }24}25 26static void bm_ranges_swap_ranges_vb_unaligned(benchmark::State& state) {27 auto n = state.range();28 std::vector<bool> vec1(n, true);29 std::vector<bool> vec2(n + 8, true);30 auto beg1 = std::ranges::begin(vec1);31 auto end1 = std::ranges::end(vec1);32 auto beg2 = std::ranges::begin(vec2) + 4;33 auto end2 = std::ranges::end(vec2) - 4;34 for (auto _ : state) {35 benchmark::DoNotOptimize(std::ranges::swap_ranges(beg1, end1, beg2, end2));36 benchmark::DoNotOptimize(&vec1);37 benchmark::DoNotOptimize(&vec2);38 }39}40 41// Test std::ranges::swap_ranges for vector<bool>::iterator42BENCHMARK(bm_ranges_swap_ranges_vb_aligned)->RangeMultiplier(2)->Range(8, 1 << 20);43BENCHMARK(bm_ranges_swap_ranges_vb_unaligned)->Range(8, 1 << 20);44 45static void bm_swap_ranges_vb(benchmark::State& state, bool aligned) {46 auto n = state.range();47 std::vector<bool> vec1(n, true);48 std::vector<bool> vec2(aligned ? n : n + 8, true);49 auto beg1 = vec1.begin();50 auto end1 = vec1.end();51 auto beg2 = aligned ? vec2.begin() : vec2.begin() + 4;52 for (auto _ : state) {53 benchmark::DoNotOptimize(std::swap_ranges(beg1, end1, beg2));54 benchmark::DoNotOptimize(&vec1);55 benchmark::DoNotOptimize(&vec2);56 }57}58 59static void bm_swap_ranges_vb_aligned(benchmark::State& state) { bm_swap_ranges_vb(state, true); }60static void bm_swap_ranges_vb_unaligned(benchmark::State& state) { bm_swap_ranges_vb(state, false); }61 62// Test std::swap_ranges for vector<bool>::iterator63BENCHMARK(bm_swap_ranges_vb_aligned)->Range(8, 1 << 20);64BENCHMARK(bm_swap_ranges_vb_unaligned)->Range(8, 1 << 20);65 66BENCHMARK_MAIN();67