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 <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(value: &vec1);
22 benchmark::DoNotOptimize(value: &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(value: &vec1);
37 benchmark::DoNotOptimize(value: &vec2);
38 }
39}
40
41// Test std::ranges::swap_ranges for vector<bool>::iterator
42BENCHMARK(bm_ranges_swap_ranges_vb_aligned)->RangeMultiplier(multiplier: 2)->Range(start: 8, limit: 1 << 20);
43BENCHMARK(bm_ranges_swap_ranges_vb_unaligned)->Range(start: 8, limit: 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(value: std::swap_ranges(first1: beg1, last1: end1, first2: beg2));
54 benchmark::DoNotOptimize(value: &vec1);
55 benchmark::DoNotOptimize(value: &vec2);
56 }
57}
58
59static void bm_swap_ranges_vb_aligned(benchmark::State& state) { bm_swap_ranges_vb(state, aligned: true); }
60static void bm_swap_ranges_vb_unaligned(benchmark::State& state) { bm_swap_ranges_vb(state, aligned: false); }
61
62// Test std::swap_ranges for vector<bool>::iterator
63BENCHMARK(bm_swap_ranges_vb_aligned)->Range(start: 8, limit: 1 << 20);
64BENCHMARK(bm_swap_ranges_vb_unaligned)->Range(start: 8, limit: 1 << 20);
65
66BENCHMARK_MAIN();
67

source code of libcxx/test/benchmarks/algorithms/swap_ranges.bench.cpp