Skip to content

Commit fd78472

Browse files
committed
[libc++] Rewrite minmax_element benchmark
The benchmark currently uses makeCartesianProductBenchmark, which doesn't make a ton of sense, since minmax_element always goes through every element one by one. The runtime doesn't depend on the values of the elements. Fixes llvm#120758
1 parent f7ba2bd commit fd78472

File tree

1 file changed

+31
-22
lines changed

1 file changed

+31
-22
lines changed

libcxx/test/benchmarks/algorithms/min_max_element.bench.cpp

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,42 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9-
// UNSUPPORTED: c++03, c++11, c++14
9+
// UNSUPPORTED: c++03, c++11, c++14, c++17
1010

1111
#include <algorithm>
12+
#include <vector>
1213

13-
#include "common.h"
14+
#include <benchmark/benchmark.h>
1415

15-
namespace {
16-
template <class ValueType, class Order>
17-
struct MinMaxElement {
18-
size_t Quantity;
16+
void run_sizes(auto benchmark) {
17+
benchmark->Arg(1)
18+
->Arg(2)
19+
->Arg(3)
20+
->Arg(4)
21+
->Arg(64)
22+
->Arg(512)
23+
->Arg(1024)
24+
->Arg(4000)
25+
->Arg(4096)
26+
->Arg(5500)
27+
->Arg(64000)
28+
->Arg(65536)
29+
->Arg(70000);
30+
}
1931

20-
void run(benchmark::State& state) const {
21-
runOpOnCopies<ValueType>(state, Quantity, Order(), BatchSize::CountElements, [](auto& Copy) {
22-
benchmark::DoNotOptimize(std::minmax_element(Copy.begin(), Copy.end()));
23-
});
24-
}
32+
template <class T>
33+
void BM_std_minmax_element(benchmark::State& state) {
34+
std::vector<T> vec(state.range(), 3);
2535

26-
std::string name() const {
27-
return "BM_MinMaxElement" + ValueType::name() + Order::name() + "_" + std::to_string(Quantity);
36+
for (auto _ : state) {
37+
benchmark::DoNotOptimize(vec);
38+
benchmark::DoNotOptimize(std::minmax_element(vec.begin(), vec.end()));
2839
}
29-
};
30-
} // namespace
31-
32-
int main(int argc, char** argv) {
33-
benchmark::Initialize(&argc, argv);
34-
if (benchmark::ReportUnrecognizedArguments(argc, argv))
35-
return 1;
36-
makeCartesianProductBenchmark<MinMaxElement, AllValueTypes, AllOrders>(Quantities);
37-
benchmark::RunSpecifiedBenchmarks();
3840
}
41+
42+
BENCHMARK(BM_std_minmax_element<char>)->Apply(run_sizes);
43+
BENCHMARK(BM_std_minmax_element<short>)->Apply(run_sizes);
44+
BENCHMARK(BM_std_minmax_element<int>)->Apply(run_sizes);
45+
BENCHMARK(BM_std_minmax_element<long long>)->Apply(run_sizes);
46+
47+
BENCHMARK_MAIN();

0 commit comments

Comments
 (0)