66 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 <cstddef>13#include <deque>14#include <iterator>15#include <list>16#include <string>17#include <vector>18 19#include "benchmark/benchmark.h"20#include "../../GenerateInput.h"21 22int main(int argc, char** argv) {23 auto std_swap_ranges = [](auto first1, auto last1, auto first2, auto) {24 return std::swap_ranges(first1, last1, first2);25 };26 27 // {std,ranges}::swap_ranges(normal container)28 {29 auto bm = []<class Container>(std::string name, auto swap_ranges) {30 benchmark::RegisterBenchmark(31 name,32 [swap_ranges](auto& st) {33 std::size_t const size = st.range(0);34 using ValueType = typename Container::value_type;35 Container c1, c2;36 std::generate_n(std::back_inserter(c1), size, [] { return Generate<ValueType>::random(); });37 std::generate_n(std::back_inserter(c2), size, [] { return Generate<ValueType>::random(); });38 39 for ([[maybe_unused]] auto _ : st) {40 benchmark::DoNotOptimize(c1);41 benchmark::DoNotOptimize(c2);42 auto result = swap_ranges(c1.begin(), c1.end(), c2.begin(), c2.end());43 benchmark::DoNotOptimize(result);44 benchmark::DoNotOptimize(c1);45 benchmark::DoNotOptimize(c2);46 }47 })48 ->Arg(32)49 ->Arg(50) // non power-of-two50 ->Arg(1024)51 ->Arg(8192);52 };53 bm.operator()<std::vector<int>>("std::swap_ranges(vector<int>)", std_swap_ranges);54 bm.operator()<std::deque<int>>("std::swap_ranges(deque<int>)", std_swap_ranges);55 bm.operator()<std::list<int>>("std::swap_ranges(list<int>)", std_swap_ranges);56 bm.operator()<std::vector<int>>("rng::swap_ranges(vector<int>)", std::ranges::swap_ranges);57 bm.operator()<std::deque<int>>("rng::swap_ranges(deque<int>)", std::ranges::swap_ranges);58 bm.operator()<std::list<int>>("rng::swap_ranges(list<int>)", std::ranges::swap_ranges);59 }60 61 benchmark::Initialize(&argc, argv);62 benchmark::RunSpecifiedBenchmarks();63 benchmark::Shutdown();64 return 0;65}66