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