Skip to content

Commit bd58f5b

Browse files
committed
Simplify fold benchmark by using unsigned arithmetic
1 parent 763b516 commit bd58f5b

File tree

1 file changed

+10
-15
lines changed

1 file changed

+10
-15
lines changed

libcxx/test/benchmarks/algorithms/nonmodifying/fold.bench.cpp

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@
99
// UNSUPPORTED: c++03, c++11, c++14, c++17
1010

1111
#include <algorithm>
12-
#include <cassert>
1312
#include <cstddef>
1413
#include <deque>
1514
#include <iterator>
16-
#include <limits>
1715
#include <list>
1816
#include <string>
17+
#include <type_traits>
1918
#include <vector>
2019

2120
#include <benchmark/benchmark.h>
@@ -30,15 +29,11 @@ int main(int argc, char** argv) {
3029
[fold](auto& st) {
3130
std::size_t const size = st.range(0);
3231
using ValueType = typename Container::value_type;
33-
ValueType const limit = 1000; // ensure we never overflow in the addition
34-
assert(static_cast<ValueType>(size) <= std::numeric_limits<ValueType>::max());
35-
assert(std::numeric_limits<ValueType>::max() > static_cast<ValueType>(size) * limit);
36-
assert(std::numeric_limits<ValueType>::min() < static_cast<ValueType>(size) * limit * -1);
32+
static_assert(std::is_unsigned_v<ValueType>,
33+
"We could encounter UB if signed arithmetic overflows in this benchmark");
3734

3835
Container c;
39-
std::generate_n(std::back_inserter(c), size, [&] {
40-
return std::clamp(Generate<ValueType>::random(), -1 * limit, limit);
41-
});
36+
std::generate_n(std::back_inserter(c), size, [&] { return Generate<ValueType>::random(); });
4237
ValueType init = c.back();
4338
c.pop_back();
4439

@@ -61,14 +56,14 @@ int main(int argc, char** argv) {
6156
->Arg(8192)
6257
->Arg(1 << 20);
6358
};
64-
bm.operator()<std::vector<int>>("rng::fold_left(vector<int>)", std::ranges::fold_left);
65-
bm.operator()<std::deque<int>>("rng::fold_left(deque<int>)", std::ranges::fold_left);
66-
bm.operator()<std::list<int>>("rng::fold_left(list<int>)", std::ranges::fold_left);
59+
bm.operator()<std::vector<unsigned int>>("rng::fold_left(vector<int>)", std::ranges::fold_left);
60+
bm.operator()<std::deque<unsigned int>>("rng::fold_left(deque<int>)", std::ranges::fold_left);
61+
bm.operator()<std::list<unsigned int>>("rng::fold_left(list<int>)", std::ranges::fold_left);
6762

6863
// TODO: fold_right not implemented yet
69-
// bm.operator()<std::vector<int>>("rng::fold_right(vector<int>)", std::ranges::fold_right);
70-
// bm.operator()<std::deque<int>>("rng::fold_right(deque<int>)", std::ranges::fold_right);
71-
// bm.operator()<std::list<int>>("rng::fold_right(list<int>)", std::ranges::fold_right);
64+
// bm.operator()<std::vector<unsigned int>>("rng::fold_right(vector<int>)", std::ranges::fold_right);
65+
// bm.operator()<std::deque<unsigned int>>("rng::fold_right(deque<int>)", std::ranges::fold_right);
66+
// bm.operator()<std::list<unsigned int>>("rng::fold_right(list<int>)", std::ranges::fold_right);
7267
}
7368

7469
benchmark::Initialize(&argc, argv);

0 commit comments

Comments
 (0)