| //===- DWARFVerifierBM.cpp - DieRangeInfo::insert benchmark ---------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "benchmark/benchmark.h" | |
| #include "llvm/DebugInfo/DWARF/DWARFVerifier.h" | |
| #include <algorithm> | |
| #include <random> | |
| #include <vector> | |
| using namespace llvm; | |
| using DieRangeInfo = DWARFVerifier::DieRangeInfo; | |
| static DieRangeInfo makeRI(uint64_t Lo, uint64_t Hi) { | |
| return DieRangeInfo({{Lo, Hi}}); | |
| } | |
| // Insert N non-overlapping ranges in forward address order. | |
| static void BM_DieRangeInfoInsertForward(benchmark::State &State) { | |
| const unsigned N = State.range(0); | |
| for (auto _ : State) { | |
| DieRangeInfo Parent; | |
| for (unsigned I = 0; I < N; ++I) { | |
| uint64_t Lo = I * 100; | |
| uint64_t Hi = Lo + 50; | |
| Parent.insert(makeRI(Lo, Hi)); | |
| } | |
| benchmark::DoNotOptimize(Parent); | |
| } | |
| } | |
| BENCHMARK(BM_DieRangeInfoInsertForward)->Arg(1000)->Arg(10000)->Arg(100000); | |
| // Insert N non-overlapping ranges in reverse address order. | |
| static void BM_DieRangeInfoInsertReverse(benchmark::State &State) { | |
| const unsigned N = State.range(0); | |
| for (auto _ : State) { | |
| DieRangeInfo Parent; | |
| for (unsigned I = N; I > 0; --I) { | |
| uint64_t Lo = I * 100; | |
| uint64_t Hi = Lo + 50; | |
| Parent.insert(makeRI(Lo, Hi)); | |
| } | |
| benchmark::DoNotOptimize(Parent); | |
| } | |
| } | |
| BENCHMARK(BM_DieRangeInfoInsertReverse)->Arg(1000)->Arg(10000)->Arg(100000); | |
| // Insert N non-overlapping ranges in random order. | |
| static void BM_DieRangeInfoInsertRandom(benchmark::State &State) { | |
| const unsigned N = State.range(0); | |
| std::vector<std::pair<uint64_t, uint64_t>> Ranges; | |
| Ranges.reserve(N); | |
| for (unsigned I = 0; I < N; ++I) | |
| Ranges.push_back({I * 100, I * 100 + 50}); | |
| std::mt19937 RNG(42); | |
| std::shuffle(Ranges.begin(), Ranges.end(), RNG); | |
| for (auto _ : State) { | |
| DieRangeInfo Parent; | |
| for (const auto &[Lo, Hi] : Ranges) | |
| Parent.insert(makeRI(Lo, Hi)); | |
| benchmark::DoNotOptimize(Parent); | |
| } | |
| } | |
| BENCHMARK(BM_DieRangeInfoInsertRandom)->Arg(1000)->Arg(10000)->Arg(100000); | |
| // Measure single overlap detection after N-1 insertions. | |
| static void BM_DieRangeInfoOverlapDetection(benchmark::State &State) { | |
| const unsigned N = State.range(0); | |
| // Pre-build the parent with N-1 non-overlapping ranges. | |
| DieRangeInfo Base; | |
| for (unsigned I = 0; I < N - 1; ++I) { | |
| uint64_t Lo = I * 100; | |
| uint64_t Hi = Lo + 50; | |
| Base.insert(makeRI(Lo, Hi)); | |
| } | |
| uint64_t Mid = (N / 2) * 100; | |
| for (auto _ : State) { | |
| DieRangeInfo Parent = Base; | |
| auto It = Parent.insert(makeRI(Mid + 10, Mid + 60)); | |
| benchmark::DoNotOptimize(It); | |
| } | |
| } | |
| BENCHMARK(BM_DieRangeInfoOverlapDetection)->Arg(1000)->Arg(10000)->Arg(100000); | |
| BENCHMARK_MAIN(); |