...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
For some people, performance of random number generation is an important consideration when choosing a random number generator or a particular distribution function. This page provides numerous performance tests with the wide variety of generators and distributions available in the boost library.
The performance has been evaluated on an Intel(R) Core(TM) i7 CPU Q 840 @ 1.87GHz, 1867 Mhz with Visual C++ 2010, Microsoft Windows 7 Professional and with gcc 4.4.5, Ubuntu Linux 2.6.35-25-generic. The speed is reported in million random numbers per second (M rn/sec), generated in a tight loop.
Table 20.11. Basic Generators (Linux)
generator |
M rn/sec |
time per random number [nsec] |
relative speed compared to fastest [percent] |
---|---|---|---|
rand48 |
149.254 |
6.7 |
59% |
lrand48 run-time |
158.73 |
6.3 |
63% |
minstd_rand0 |
22.9885 |
43.5 |
9% |
minstd_rand |
22.0751 |
45.3 |
8% |
ecuyer combined |
42.735 |
23.4 |
17% |
kreutzer1986 |
151.515 |
6.6 |
60% |
taus88 |
250 |
4 |
100% |
knuth_b |
19.6078 |
51 |
7% |
hellekalek1995 (inversive) |
4.54545 |
220 |
1% |
mt11213b |
204.082 |
4.9 |
81% |
mt19937 |
204.082 |
4.9 |
81% |
mt19937_64 |
60.6061 |
16.5 |
24% |
lagged_fibonacci607 |
126.582 |
7.9 |
50% |
lagged_fibonacci1279 |
129.87 |
7.7 |
51% |
lagged_fibonacci2281 |
129.87 |
7.7 |
51% |
lagged_fibonacci3217 |
131.579 |
7.6 |
52% |
lagged_fibonacci4423 |
128.205 |
7.8 |
51% |
lagged_fibonacci9689 |
128.205 |
7.8 |
51% |
lagged_fibonacci19937 |
131.579 |
7.6 |
52% |
lagged_fibonacci23209 |
131.579 |
7.6 |
52% |
lagged_fibonacci44497 |
131.579 |
7.6 |
52% |
subtract_with_carry |
147.059 |
6.8 |
58% |
subtract_with_carry_01 |
105.263 |
9.5 |
42% |
ranlux3 |
15.748 |
63.5 |
6% |
ranlux4 |
9.11577 |
109.7 |
3% |
ranlux3_01 |
10.5708 |
94.6 |
4% |
ranlux4_01 |
6.27353 |
159.4 |
2% |
ranlux64_3 |
15.8983 |
62.9 |
6% |
ranlux64_4 |
9.14913 |
109.3 |
3% |
ranlux64_3_01 |
10.9409 |
91.4 |
4% |
ranlux64_4_01 |
6.32911 |
158 |
2% |
ranlux24 |
15.1976 |
65.8 |
6% |
ranlux48 |
8.88099 |
112.6 |
3% |
mt19937ar.c |
111.111 |
9 |
44% |
Table 20.12. Basic Generators (Windows)
generator |
M rn/sec |
time per random number [nsec] |
relative speed compared to fastest [percent] |
---|---|---|---|
rand48 |
152.672 |
6.55 |
64% |
lrand48 run-time |
24.3724 |
41.03 |
10% |
minstd_rand0 |
39.8248 |
25.11 |
16% |
minstd_rand |
39.0778 |
25.59 |
16% |
ecuyer combined |
16.7813 |
59.59 |
7% |
kreutzer1986 |
89.0472 |
11.23 |
37% |
taus88 |
237.53 |
4.21 |
100% |
knuth_b |
30.8166 |
32.45 |
12% |
hellekalek1995 (inversive) |
5.28457 |
189.23 |
2% |
mt11213b |
237.53 |
4.21 |
100% |
mt19937 |
221.239 |
4.52 |
93% |
mt19937_64 |
91.5751 |
10.92 |
38% |
lagged_fibonacci607 |
142.45 |
7.02 |
59% |
lagged_fibonacci1279 |
142.45 |
7.02 |
59% |
lagged_fibonacci2281 |
145.56 |
6.87 |
61% |
lagged_fibonacci3217 |
149.031 |
6.71 |
62% |
lagged_fibonacci4423 |
142.45 |
7.02 |
59% |
lagged_fibonacci9689 |
145.773 |
6.86 |
61% |
lagged_fibonacci19937 |
142.45 |
7.02 |
59% |
lagged_fibonacci23209 |
145.773 |
6.86 |
61% |
lagged_fibonacci44497 |
142.45 |
7.02 |
59% |
subtract_with_carry |
136.24 |
7.34 |
57% |
subtract_with_carry_01 |
90.3342 |
11.07 |
38% |
ranlux3 |
13.1631 |
75.97 |
5% |
ranlux4 |
7.60398 |
131.51 |
3% |
ranlux3_01 |
8.62738 |
115.91 |
3% |
ranlux4_01 |
4.99625 |
200.15 |
2% |
ranlux64_3 |
13.1631 |
75.97 |
5% |
ranlux64_4 |
7.5861 |
131.82 |
3% |
ranlux64_3_01 |
8.63931 |
115.75 |
3% |
ranlux64_4_01 |
5.01958 |
199.22 |
2% |
ranlux24 |
13.1631 |
75.97 |
5% |
ranlux48 |
7.5861 |
131.82 |
3% |
mt19937ar.c |
200.401 |
4.99 |
84% |
Note that the lagged Fibonacci and ranlux_01 generators produce floating-point numbers, whereas all others produce integers.
Table 20.13. Distributions (Linux)
[M rn/sec] |
minstd_rand |
kreutzer1986 |
mt19937 |
lagged_fibonacci607 |
---|---|---|---|---|
uniform_int |
16.2338 |
48.7805 |
21.5517 |
23.8663 |
uniform_smallint |
18.9036 |
114.943 |
25.3165 |
74.6269 |
bernoulli |
21.322 |
85.4701 |
23.2558 |
125 |
geometric |
9.42507 |
11.7925 |
7.38007 |
15.528 |
binomial |
13.4953 |
29.7619 |
12.7877 |
38.7597 |
negative_binomial |
1.69549 |
2.29305 |
1.65563 |
2.45098 |
poisson |
13.7552 |
34.1297 |
13.369 |
43.8596 |
uniform_real |
18.2815 |
44.4444 |
19.8413 |
119.048 |
uniform_01 |
21.692 |
72.4638 |
17.1233 |
116.279 |
triangle |
15.2207 |
29.3255 |
11.9904 |
51.2821 |
exponential |
10.5374 |
17.0068 |
10.8814 |
22.2222 |
normal polar |
8.82613 |
12.9199 |
9.00901 |
14.771 |
lognormal |
6.15764 |
7.50188 |
5.68182 |
8.61326 |
chi squared |
2.07297 |
2.8401 |
2.10926 |
3.07409 |
cauchy |
9.18274 |
14.8368 |
7.37463 |
17.3913 |
fisher f |
1.04646 |
1.47449 |
1.08026 |
1.61186 |
student t |
1.60927 |
2.18245 |
1.65207 |
2.34192 |
gamma |
2.1097 |
2.87439 |
2.13538 |
3.01296 |
weibull |
4.73709 |
5.77367 |
4.20521 |
6.33312 |
extreme value |
7.40192 |
10.101 |
6.23441 |
11.5741 |
uniform_on_sphere |
2.22222 |
2.78552 |
2.28311 |
2.7933 |
Table 20.14. Distributions (Windows)
[M rn/sec] |
minstd_rand |
kreutzer1986 |
mt19937 |
lagged_fibonacci607 |
---|---|---|---|---|
uniform_int |
27.049 |
79.1139 |
29.8151 |
34.8432 |
uniform_smallint |
31.736 |
90.3342 |
33.9213 |
59.9161 |
bernoulli |
25.641 |
56.2114 |
27.049 |
62.8141 |
geometric |
12.8717 |
18.9645 |
14.6671 |
18.5805 |
binomial |
18.2116 |
32.2165 |
19.8491 |
29.4118 |
negative_binomial |
2.79065 |
3.99138 |
2.73358 |
3.72898 |
poisson |
20.0321 |
37.7074 |
18.9645 |
36.4299 |
uniform_real |
27.6319 |
78.1861 |
26.4901 |
71.2251 |
uniform_01 |
36.63 |
95.6938 |
26.3783 |
85.4701 |
triangle |
19.4856 |
43.8982 |
19.425 |
36.8324 |
exponential |
17.0474 |
32.0513 |
18.005 |
28.6205 |
normal polar |
14.4051 |
19.7863 |
13.1354 |
20.7426 |
lognormal |
10.8472 |
13.6968 |
10.3563 |
13.7855 |
chi squared |
3.53957 |
4.95 |
3.44448 |
4.83442 |
cauchy |
15.1906 |
23.5682 |
14.9768 |
23.31 |
fisher f |
1.74951 |
2.45417 |
1.69854 |
2.38743 |
student t |
2.63151 |
3.75291 |
2.53872 |
3.51432 |
gamma |
3.50275 |
4.9729 |
3.35087 |
4.75195 |
weibull |
8.96539 |
11.9161 |
9.09256 |
11.6754 |
extreme value |
12.3274 |
18.4196 |
12.5945 |
17.5623 |
uniform_on_sphere |
2.83688 |
3.58038 |
2.73898 |
3.60101 |