@@ -22,6 +22,17 @@ struct mean {
2222 }
2323};
2424
25+ template <typename Rng, typename Dist>
26+ void bench_int_dist (picobench::state& s) {
27+ Rng rng (9857 );
28+ Dist dist (-100 , 100 );
29+ mean m;
30+ for (uauto _ : s) {
31+ m += dist (rng);
32+ }
33+ s.set_result (m.get (10 ));
34+ }
35+
2536template <typename Rng, typename Dist>
2637void bench_real_dist (picobench::state& s) {
2738 Rng rng (12345 );
@@ -55,25 +66,53 @@ void bench_std_real_dist_01(picobench::state& s) {
5566}
5667
5768template <typename T>
58- struct dist {
59- using fast = itlib::fast_uniform_real_distribution<T>;
60- using std = std::uniform_real_distribution<T>;
61- };
69+ using int_itlib = itlib::uniform_int_distribution<T>;
70+ template <typename T>
71+ using int_std = std::uniform_int_distribution<T>;
72+ template <typename T>
73+ using real_fast = itlib::fast_uniform_real_distribution<T>;
74+ template <typename T>
75+ using real_std = std::uniform_real_distribution<T>;
76+
77+ template <typename Rng>
78+ void add_int_benchmarks (picobench::local_runner& r) {
79+ r.add_benchmark (" itlib int32" , bench_int_dist<Rng, int_itlib<int32_t >>);
80+ r.add_benchmark (" std int32" , bench_int_dist<Rng, int_std<int32_t >>);
81+ r.add_benchmark (" itlib int64" , bench_int_dist<Rng, int_itlib<int64_t >>);
82+ r.add_benchmark (" std int64" , bench_int_dist<Rng, int_std<int64_t >>);
83+ }
84+
85+ template <typename Rng>
86+ void add_real_benchmarks (picobench::local_runner& r) {
87+ r.add_benchmark (" fast float" , bench_real_dist<Rng, real_fast<float >>);
88+ r.add_benchmark (" fast double" , bench_real_dist<Rng, real_fast<double >>);
89+ r.add_benchmark (" std float" , bench_real_dist<Rng, real_std<float >>);
90+ r.add_benchmark (" std double" , bench_real_dist<Rng, real_std<double >>);
91+ }
6292
6393int main (int argc, char * argv[]) {
6494 picobench::local_runner r;
6595
96+ r.set_suite (" int dist mt19937" );
97+ add_int_benchmarks<std::mt19937>(r);
98+
99+ r.set_suite (" int dist minstd_rand" );
100+ add_int_benchmarks<std::minstd_rand>(r);
101+
66102 r.set_suite (" real dist mt19937" );
67- r.add_benchmark (" fast float" , bench_real_dist<std::mt19937, dist<float >::fast>);
68- r.add_benchmark (" fast double" , bench_real_dist<std::mt19937, dist<double >::fast>);
69- r.add_benchmark (" std float" , bench_real_dist<std::mt19937, dist<float >::std>);
70- r.add_benchmark (" std double" , bench_real_dist<std::mt19937, dist<double >::std>);
103+ add_real_benchmarks<std::mt19937>(r);
71104
72105 r.set_suite (" real dist mt19937 01" );
73- r.add_benchmark (" fast float 01" , bench_real_dist_01<std::mt19937, dist<float >::fast>);
74- r.add_benchmark (" fast double 01" , bench_real_dist_01<std::mt19937, dist<double >::fast>);
75- r.add_benchmark (" std float 01" , bench_std_real_dist_01<std::mt19937, float >);
76- r.add_benchmark (" std double 01" , bench_std_real_dist_01<std::mt19937, double >);
106+ r.add_benchmark (" fast float" , bench_real_dist_01<std::mt19937, real_fast<float >>);
107+ r.add_benchmark (" fast double" , bench_real_dist_01<std::mt19937, real_fast<double >>);
108+ r.add_benchmark (" std float" , bench_std_real_dist_01<std::mt19937, float >);
109+ r.add_benchmark (" std double" , bench_std_real_dist_01<std::mt19937, double >);
110+
111+ r.set_suite (" real dist mt19937_64" );
112+ add_real_benchmarks<std::mt19937_64>(r);
113+
114+ r.set_suite (" real dist minstd_rand" );
115+ add_real_benchmarks<std::minstd_rand>(r);
77116
78117 r.set_compare_results_across_samples (true );
79118 r.set_compare_results_across_benchmarks (true );
0 commit comments