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.concurrent.TimeUnit;
21 import java.util.function.Supplier;
22 import org.apache.commons.rng.JumpableUniformRandomProvider;
23 import org.apache.commons.rng.LongJumpableUniformRandomProvider;
24 import org.apache.commons.rng.UniformRandomProvider;
25 import org.apache.commons.rng.simple.RandomSource;
26 import org.openjdk.jmh.annotations.Benchmark;
27 import org.openjdk.jmh.annotations.BenchmarkMode;
28 import org.openjdk.jmh.annotations.Fork;
29 import org.openjdk.jmh.annotations.Measurement;
30 import org.openjdk.jmh.annotations.Mode;
31 import org.openjdk.jmh.annotations.OutputTimeUnit;
32 import org.openjdk.jmh.annotations.Param;
33 import org.openjdk.jmh.annotations.Scope;
34 import org.openjdk.jmh.annotations.Setup;
35 import org.openjdk.jmh.annotations.State;
36 import org.openjdk.jmh.annotations.Warmup;
37
38
39
40
41 @BenchmarkMode(Mode.AverageTime)
42 @OutputTimeUnit(TimeUnit.NANOSECONDS)
43 @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
44 @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
45 @State(Scope.Benchmark)
46 @Fork(value = 1, jvmArgs = { "-server", "-Xms128M", "-Xmx128M" })
47 public class JumpBenchmark {
48
49
50
51 @State(Scope.Benchmark)
52 public abstract static class BaseJumpableSource {
53
54 private Supplier<UniformRandomProvider> gen;
55
56
57
58
59
60
61 UniformRandomProvider jump() {
62 return gen.get();
63 }
64
65
66
67
68 @Setup
69 public void setup() {
70 gen = createJumpFunction();
71 }
72
73
74
75
76
77
78
79
80 protected abstract Supplier<UniformRandomProvider> createJumpFunction();
81 }
82
83
84
85
86 public static class JumpableSource extends BaseJumpableSource {
87
88
89
90
91
92
93 @Param({"XOR_SHIFT_1024_S",
94
95 "XO_SHI_RO_128_PLUS",
96
97 "XO_RO_SHI_RO_128_PLUS",
98
99 "XO_SHI_RO_256_PLUS",
100
101 "XO_SHI_RO_512_PLUS",
102
103
104 "XO_RO_SHI_RO_128_PP",
105
106
107 "XO_RO_SHI_RO_1024_PP",
108
109
110
111
112
113 "L64_X128_MIX",
114 "L64_X256_MIX",
115 "L64_X1024_MIX",
116 "L128_X128_MIX",
117 "L128_X256_MIX",
118 "L128_X1024_MIX",
119 "L32_X64_MIX"})
120 private String randomSourceName;
121
122
123 @Override
124 protected Supplier<UniformRandomProvider> createJumpFunction() {
125 final UniformRandomProvider rng = RandomSource.valueOf(randomSourceName).create();
126 if (rng instanceof JumpableUniformRandomProvider) {
127 return ((JumpableUniformRandomProvider) rng)::jump;
128 }
129 throw new IllegalStateException("Invalid jump source: " + randomSourceName);
130 }
131 }
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 public static class LongJumpableSource extends BaseJumpableSource {
149
150
151
152 @Param({
153
154
155 "L64_X128_MIX",
156 "L64_X256_MIX",
157 "L64_X1024_MIX",
158
159
160
161 "L128_X128_MIX",
162 "L128_X256_MIX",
163 "L128_X1024_MIX",
164
165
166 "L32_X64_MIX"})
167 private String randomSourceName;
168
169
170
171 @Override
172 protected Supplier<UniformRandomProvider> createJumpFunction() {
173 final UniformRandomProvider rng = RandomSource.valueOf(randomSourceName).create();
174 if (rng instanceof LongJumpableUniformRandomProvider) {
175 return ((LongJumpableUniformRandomProvider) rng)::longJump;
176 }
177 throw new IllegalStateException("Invalid long jump source: " + randomSourceName);
178 }
179 }
180
181
182
183
184
185
186
187 @Benchmark
188 public UniformRandomProvider jump(JumpableSource data) {
189 return data.jump();
190 }
191
192
193
194
195
196
197
198 @Benchmark
199 public UniformRandomProvider longJump(LongJumpableSource data) {
200 return data.jump();
201 }
202 }