brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · c4ea753 Raw
73 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_transform = [](auto first1, auto last1, auto first2, auto, auto out, auto f) {24    return std::transform(first1, last1, first2, out, f);25  };26 27  // {std,ranges}::transform(normal container, normal container)28  {29    auto bm = []<class Container>(std::string name, auto transform) {30      benchmark::RegisterBenchmark(31          name,32          [transform](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            std::vector<ValueType> out(size);40 41            auto f = [](auto x, auto y) {42              benchmark::DoNotOptimize(x);43              benchmark::DoNotOptimize(y);44              return x + y;45            };46 47            for ([[maybe_unused]] auto _ : st) {48              benchmark::DoNotOptimize(c1);49              benchmark::DoNotOptimize(c2);50              benchmark::DoNotOptimize(out);51              auto result = transform(c1.begin(), c1.end(), c2.begin(), c2.end(), out.begin(), f);52              benchmark::DoNotOptimize(result);53            }54          })55          ->Arg(32)56          ->Arg(50) // non power-of-two57          ->Arg(1024)58          ->Arg(8192);59    };60    bm.operator()<std::vector<int>>("std::transform(vector<int>, vector<int>)", std_transform);61    bm.operator()<std::deque<int>>("std::transform(deque<int>, deque<int>)", std_transform);62    bm.operator()<std::list<int>>("std::transform(list<int>, list<int>)", std_transform);63    bm.operator()<std::vector<int>>("rng::transform(vector<int>, vector<int>)", std::ranges::transform);64    bm.operator()<std::deque<int>>("rng::transform(deque<int>, deque<int>)", std::ranges::transform);65    bm.operator()<std::list<int>>("rng::transform(list<int>, list<int>)", std::ranges::transform);66  }67 68  benchmark::Initialize(&argc, argv);69  benchmark::RunSpecifiedBenchmarks();70  benchmark::Shutdown();71  return 0;72}73