Skip to content

Commit bf73723

Browse files
committed
add benchmark code to the repo
1 parent 3970473 commit bf73723

File tree

3 files changed

+102
-8
lines changed

3 files changed

+102
-8
lines changed

benchmarks/CMakeLists.txt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,5 @@ function(add_benchmark name)
7171
target_link_libraries(benchmark-${name} PRIVATE benchmark::benchmark)
7272
endfunction()
7373

74-
add_benchmark(std_copy
75-
src/std_copy.cpp
76-
CXX_STANDARD 23
77-
)
74+
add_benchmark(std_copy src/std_copy.cpp)
75+
add_benchmark(random_integer_generation src/random_integer_generation.cpp)
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
#include <benchmark/benchmark.h>
2+
#include <random>
3+
4+
/// Test URBGs alone
5+
6+
static void BM_mt19937(benchmark::State& state) {
7+
std::mt19937 gen;
8+
for (auto _ : state) {
9+
benchmark::DoNotOptimize(gen());
10+
}
11+
}
12+
BENCHMARK(BM_mt19937);
13+
14+
static void BM_mt19937_64(benchmark::State& state) {
15+
std::mt19937_64 gen;
16+
for (auto _ : state) {
17+
benchmark::DoNotOptimize(gen());
18+
}
19+
}
20+
BENCHMARK(BM_mt19937_64);
21+
22+
static void BM_lcg(benchmark::State& state) {
23+
std::minstd_rand gen;
24+
for (auto _ : state) {
25+
benchmark::DoNotOptimize(gen());
26+
}
27+
}
28+
BENCHMARK(BM_lcg);
29+
30+
uint32_t GetMax() {
31+
std::random_device gen;
32+
std::uniform_int_distribution<uint32_t> dist(10'000'000, 20'000'000);
33+
return dist(gen);
34+
}
35+
36+
static const uint32_t max = GetMax(); // random divisor to prevent strength reduction
37+
38+
/// Test mt19937
39+
40+
static void BM_raw_mt19937_old(benchmark::State& state) {
41+
std::mt19937 gen;
42+
std::_Rng_from_urng<uint32_t, decltype(gen)> rng(gen);
43+
for (auto _ : state) {
44+
benchmark::DoNotOptimize(rng(max));
45+
}
46+
}
47+
BENCHMARK(BM_raw_mt19937_old);
48+
49+
static void BM_raw_mt19937_new(benchmark::State& state) {
50+
std::mt19937 gen;
51+
std::_Rng_from_urng_v2<uint32_t, decltype(gen)> rng(gen);
52+
for (auto _ : state) {
53+
benchmark::DoNotOptimize(rng(max));
54+
}
55+
}
56+
BENCHMARK(BM_raw_mt19937_new);
57+
58+
/// Test mt19937_64
59+
60+
static void BM_raw_mt19937_64_old(benchmark::State& state) {
61+
std::mt19937_64 gen;
62+
std::_Rng_from_urng<uint64_t, decltype(gen)> rng(gen);
63+
for (auto _ : state) {
64+
benchmark::DoNotOptimize(rng(max));
65+
}
66+
}
67+
BENCHMARK(BM_raw_mt19937_64_old);
68+
69+
static void BM_raw_mt19937_64_new(benchmark::State& state) {
70+
std::mt19937_64 gen;
71+
std::_Rng_from_urng_v2<uint64_t, decltype(gen)> rng(gen);
72+
for (auto _ : state) {
73+
benchmark::DoNotOptimize(rng(max));
74+
}
75+
}
76+
BENCHMARK(BM_raw_mt19937_64_new);
77+
78+
/// Test minstd_rand
79+
80+
static void BM_raw_lcg_old(benchmark::State& state) {
81+
std::minstd_rand gen;
82+
std::_Rng_from_urng<uint32_t, decltype(gen)> rng(gen);
83+
for (auto _ : state) {
84+
benchmark::DoNotOptimize(rng(max));
85+
}
86+
}
87+
BENCHMARK(BM_raw_lcg_old);
88+
89+
static void BM_raw_lcg_new(benchmark::State& state) {
90+
std::minstd_rand gen;
91+
std::_Rng_from_urng_v2<uint32_t, decltype(gen)> rng(gen);
92+
for (auto _ : state) {
93+
benchmark::DoNotOptimize(rng(max));
94+
}
95+
}
96+
BENCHMARK(BM_raw_lcg_new);
97+
98+
BENCHMARK_MAIN();

stl/inc/random

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1844,9 +1844,7 @@ private:
18441844

18451845
template <class _Engine>
18461846
result_type _Eval(_Engine& _Eng, _Ty _Min, _Ty _Max) const { // compute next value in range [_Min, _Max]
1847-
conditional_t<_Has_static_min_max<_Engine>::value, _Rng_from_urng_v2<_Uty, _Engine>,
1848-
_Rng_from_urng<_Uty, _Engine>>
1849-
_Generator(_Eng);
1847+
_Rng_from_urng<_Uty, _Engine> _Generator(_Eng);
18501848

18511849
const _Uty _Umin = _Adjust(static_cast<_Uty>(_Min));
18521850
const _Uty _Umax = _Adjust(static_cast<_Uty>(_Max));
@@ -1864,7 +1862,7 @@ private:
18641862

18651863
static _Uty _Adjust(_Uty _Uval) { // convert signed ranges to unsigned ranges and vice versa
18661864
if constexpr (is_signed_v<_Ty>) {
1867-
constexpr _Uty _Adjuster = (static_cast<_Uty>(-1) >> 1) + 1; // 2^(N-1)
1865+
const _Uty _Adjuster = (static_cast<_Uty>(-1) >> 1) + 1; // 2^(N-1)
18681866

18691867
if (_Uval < _Adjuster) {
18701868
return static_cast<_Uty>(_Uval + _Adjuster);

0 commit comments

Comments
 (0)