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 <cstddef>
13#include <deque>
14#include <iterator>
15#include <list>
16#include <string>
17#include <utility>
18#include <vector>
19
20#include "benchmark/benchmark.h"
21#include "../../GenerateInput.h"
22
23int main(int argc, char** argv) {
24 auto std_shift_right = [](auto first, auto last, auto n) { return std::shift_right(first, last, n); };
25
26 // Benchmark std::shift_right where we shift exactly one element, which is the worst case.
27 {
28 auto bm = []<class Container>(std::string name, auto shift_right) {
29 benchmark::RegisterBenchmark(
30 name,
31 [shift_right](auto& st) {
32 std::size_t const size = st.range(0);
33 using ValueType = typename Container::value_type;
34 Container c;
35 std::generate_n(std::back_inserter(c), size, [] { return Generate<ValueType>::random(); });
36 std::size_t n = 1;
37
38 // To avoid ending up with a fully moved-from range, restore the element that gets
39 // overwritten by the shift after performing the shift.
40 auto first_element = c.begin();
41 auto last_element = std::next(c.begin(), size - 1);
42
43 for ([[maybe_unused]] auto _ : st) {
44 benchmark::DoNotOptimize(c);
45 benchmark::DoNotOptimize(n);
46 ValueType tmp = *last_element;
47 auto result = shift_right(c.begin(), c.end(), n);
48 *first_element = std::move(tmp);
49 benchmark::DoNotOptimize(result);
50 }
51 })
52 ->Arg(32)
53 ->Arg(50) // non power-of-two
54 ->Arg(1024)
55 ->Arg(8192);
56 };
57 bm.operator()<std::vector<int>>(name: "std::shift_right(vector<int>)", shift_right: std_shift_right);
58 bm.operator()<std::deque<int>>(name: "std::shift_right(deque<int>)", shift_right: std_shift_right);
59 bm.operator()<std::list<int>>(name: "std::shift_right(list<int>)", shift_right: std_shift_right);
60 // ranges::shift_right not implemented yet
61 }
62
63 benchmark::Initialize(&argc, argv);
64 benchmark::RunSpecifiedBenchmarks();
65 benchmark::Shutdown();
66 return 0;
67}
68

source code of libcxx/test/benchmarks/algorithms/modifying/shift_right.bench.cpp