brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 186ef79 Raw
85 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 <ranges>16#include <vector>17 18#include <benchmark/benchmark.h>19 20int main(int argc, char** argv) {21  auto std_distance = [](auto first, auto last) { return std::distance(first, last); };22 23  // {std,ranges}::distance(std::deque)24  {25    auto bm = [](std::string name, auto distance) {26      benchmark::RegisterBenchmark(27          name,28          [distance](auto& st) {29            std::size_t const size = st.range(0);30            std::deque<int> c(size, 1);31 32            for ([[maybe_unused]] auto _ : st) {33              benchmark::DoNotOptimize(c);34              auto result = distance(c.begin(), c.end());35              benchmark::DoNotOptimize(result);36            }37          })38          ->Arg(50) // non power-of-two39          ->Arg(1024)40          ->Arg(4096)41          ->Arg(8192);42    };43    bm.operator()("std::distance(deque<int>)", std_distance);44    bm.operator()("rng::distance(deque<int>)", std::ranges::distance);45  }46 47  // {std,ranges}::distance(std::join_view)48  {49    auto bm = []<class Container>(std::string name, auto distance, std::size_t seg_size) {50      benchmark::RegisterBenchmark(51          name,52          [distance, seg_size](auto& st) {53            std::size_t const size     = st.range(0);54            std::size_t const segments = (size + seg_size - 1) / seg_size;55            Container c(segments);56            for (std::size_t i = 0, n = size; i < segments; ++i, n -= seg_size) {57              c[i].resize(std::min(seg_size, n));58            }59 60            auto view  = c | std::views::join;61            auto first = view.begin();62            auto last  = view.end();63 64            for ([[maybe_unused]] auto _ : st) {65              benchmark::DoNotOptimize(c);66              auto result = distance(first, last);67              benchmark::DoNotOptimize(result);68            }69          })70          ->Arg(50) // non power-of-two71          ->Arg(1024)72          ->Arg(4096)73          ->Arg(8192);74    };75    bm.operator()<std::vector<std::vector<int>>>("std::distance(join_view(vector<vector<int>>))", std_distance, 256);76    bm.operator()<std::vector<std::vector<int>>>(77        "rng::distance(join_view(vector<vector<int>>)", std::ranges::distance, 256);78  }79 80  benchmark::Initialize(&argc, argv);81  benchmark::RunSpecifiedBenchmarks();82  benchmark::Shutdown();83  return 0;84}85