1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.rng.examples.jmh.core;
19
20 import java.util.function.IntSupplier;
21 import org.apache.commons.rng.UniformRandomProvider;
22 import org.apache.commons.rng.core.source64.LongProvider;
23 import org.apache.commons.rng.examples.jmh.RandomSources;
24 import org.apache.commons.rng.simple.RandomSource;
25 import org.openjdk.jmh.annotations.Benchmark;
26 import org.openjdk.jmh.annotations.Param;
27 import org.openjdk.jmh.annotations.Scope;
28 import org.openjdk.jmh.annotations.Setup;
29 import org.openjdk.jmh.annotations.State;
30
31
32
33
34
35 public class CachedNextGenerationPerformance extends AbstractBenchmark {
36
37 private boolean booleanValue;
38
39 private int intValue;
40
41
42
43
44
45
46 @State(Scope.Benchmark)
47 public static class BooleanSources extends RandomSources {
48
49 interface BooleanSupplier {
50
51
52
53 boolean getAsBoolean();
54 }
55
56
57
58
59 @Param({"nextBoolean", "signTest"})
60 private String method;
61
62
63 private BooleanSupplier generator;
64
65
66
67
68 boolean next() {
69 return generator.getAsBoolean();
70 }
71
72
73 @Override
74 @Setup
75 public void setup() {
76
77 super.setup();
78 final UniformRandomProvider rng = getGenerator();
79
80
81 if ("signTest".equals(method)) {
82 if (rng instanceof LongProvider) {
83 generator = () -> rng.nextLong() < 0;
84 } else {
85
86 generator = () -> rng.nextInt() < 0;
87 }
88 } else if ("nextBoolean".equals(method)) {
89
90
91
92 generator = () -> rng.nextBoolean();
93 } else {
94 throw new IllegalStateException("Unknown boolean method: " + method);
95 }
96 }
97 }
98
99
100
101
102
103
104 @State(Scope.Benchmark)
105 public static class IntSources {
106
107
108
109
110
111 @Param({"SPLIT_MIX_64",
112 "XOR_SHIFT_1024_S",
113 "TWO_CMRES",
114 "MT_64",
115 "XOR_SHIFT_1024_S_PHI",
116 "XO_RO_SHI_RO_128_PLUS",
117 "XO_RO_SHI_RO_128_SS",
118 "XO_SHI_RO_256_PLUS",
119 "XO_SHI_RO_256_SS",
120 "XO_SHI_RO_512_PLUS",
121 "XO_SHI_RO_512_SS",
122 "PCG_RXS_M_XS_64",
123 "SFC_64",
124 "JSF_64",
125 "XO_RO_SHI_RO_128_PP",
126 "XO_SHI_RO_256_PP",
127 "XO_SHI_RO_512_PP",
128 "XO_RO_SHI_RO_1024_PP",
129 "XO_RO_SHI_RO_1024_S",
130 "XO_RO_SHI_RO_1024_SS",
131 "PCG_RXS_M_XS_64_OS"})
132 private String randomSourceName;
133
134
135
136
137 @Param({"nextInt", "shiftLong"})
138 private String method;
139
140
141 private IntSupplier gen;
142
143
144
145
146 int next() {
147 return gen.getAsInt();
148 }
149
150
151 @Setup
152 public void setup() {
153 final UniformRandomProvider rng = RandomSource.valueOf(randomSourceName).create();
154 if (!(rng instanceof LongProvider)) {
155 throw new IllegalStateException("Not a LongProvider: " + rng.getClass().getName());
156 }
157
158
159 if ("shiftLong".equals(method)) {
160 gen = () -> (int) (rng.nextLong() >>> 32);
161 } else if ("nextInt".equals(method)) {
162
163
164
165 gen = () -> rng.nextInt();
166 } else {
167 throw new IllegalStateException("Unknown int method: " + method);
168 }
169 }
170 }
171
172
173
174
175 @Benchmark
176 public void baselineVoid() {
177
178 }
179
180
181
182
183
184
185 @Benchmark
186 public boolean baselineBoolean() {
187 return booleanValue;
188 }
189
190
191
192
193
194
195 @Benchmark
196 public int baselineInt() {
197 return intValue;
198 }
199
200
201
202
203
204
205
206 @Benchmark
207 public boolean nextBoolean(BooleanSources sources) {
208 return sources.next();
209 }
210
211
212
213
214
215
216
217 @Benchmark
218 public int nextInt(IntSources sources) {
219 return sources.next();
220 }
221 }