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