brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 68cac0f Raw
77 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 22auto compute_median(auto first, auto last) {23  std::vector v(first, last);24  auto middle = v.begin() + v.size() / 2;25  std::nth_element(v.begin(), middle, v.end());26  return *middle;27}28 29int main(int argc, char** argv) {30  auto std_partition_copy = [](auto first, auto last, auto out_yes, auto out_no, auto pred) {31    return std::partition_copy(first, last, out_yes, out_no, pred);32  };33 34  auto bm = []<class Container>(std::string name, auto partition_copy) {35    benchmark::RegisterBenchmark(36        name,37        [partition_copy](auto& st) {38          std::size_t const size = st.range(0);39          using ValueType        = typename Container::value_type;40          Container c;41          std::generate_n(std::back_inserter(c), size, [] { return Generate<ValueType>::random(); });42 43          std::vector<ValueType> yes(size);44          std::vector<ValueType> no(size);45          ValueType median = compute_median(c.begin(), c.end());46          auto pred        = [median](auto const& element) { return element < median; };47 48          for ([[maybe_unused]] auto _ : st) {49            benchmark::DoNotOptimize(c);50            benchmark::DoNotOptimize(yes);51            benchmark::DoNotOptimize(no);52            auto result = partition_copy(c.begin(), c.end(), yes.begin(), no.begin(), pred);53            benchmark::DoNotOptimize(result);54          }55        })56        ->Arg(32)57        ->Arg(50) // non power-of-two58        ->Arg(1024)59        ->Arg(8192);60  };61 62  // std::partition_copy63  bm.operator()<std::vector<int>>("std::partition_copy(vector<int>)", std_partition_copy);64  bm.operator()<std::deque<int>>("std::partition_copy(deque<int>)", std_partition_copy);65  bm.operator()<std::list<int>>("std::partition_copy(list<int>)", std_partition_copy);66 67  // ranges::partition_copy68  bm.operator()<std::vector<int>>("rng::partition_copy(vector<int>)", std::ranges::partition_copy);69  bm.operator()<std::deque<int>>("rng::partition_copy(deque<int>)", std::ranges::partition_copy);70  bm.operator()<std::list<int>>("rng::partition_copy(list<int>)", std::ranges::partition_copy);71 72  benchmark::Initialize(&argc, argv);73  benchmark::RunSpecifiedBenchmarks();74  benchmark::Shutdown();75  return 0;76}77