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.sampling.distribution;
19
20 import org.apache.commons.rng.UniformRandomProvider;
21 import org.apache.commons.rng.examples.jmh.RandomSources;
22 import org.apache.commons.rng.sampling.distribution.AliasMethodDiscreteSampler;
23 import org.apache.commons.rng.sampling.distribution.DiscreteSampler;
24 import org.apache.commons.rng.sampling.distribution.DiscreteUniformSampler;
25 import org.apache.commons.rng.sampling.distribution.GeometricSampler;
26 import org.apache.commons.rng.sampling.distribution.GuideTableDiscreteSampler;
27 import org.apache.commons.rng.sampling.distribution.LargeMeanPoissonSampler;
28 import org.apache.commons.rng.sampling.distribution.MarsagliaTsangWangDiscreteSampler;
29 import org.apache.commons.rng.sampling.distribution.RejectionInversionZipfSampler;
30 import org.apache.commons.rng.sampling.distribution.SmallMeanPoissonSampler;
31
32 import org.openjdk.jmh.annotations.Benchmark;
33 import org.openjdk.jmh.annotations.BenchmarkMode;
34 import org.openjdk.jmh.annotations.Fork;
35 import org.openjdk.jmh.annotations.Measurement;
36 import org.openjdk.jmh.annotations.Mode;
37 import org.openjdk.jmh.annotations.OutputTimeUnit;
38 import org.openjdk.jmh.annotations.Param;
39 import org.openjdk.jmh.annotations.Scope;
40 import org.openjdk.jmh.annotations.Setup;
41 import org.openjdk.jmh.annotations.State;
42 import org.openjdk.jmh.annotations.Warmup;
43
44 import java.util.concurrent.TimeUnit;
45
46
47
48
49
50 @BenchmarkMode(Mode.AverageTime)
51 @OutputTimeUnit(TimeUnit.NANOSECONDS)
52 @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
53 @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
54 @State(Scope.Benchmark)
55 @Fork(value = 1, jvmArgs = {"-server", "-Xms128M", "-Xmx128M"})
56 public class DiscreteSamplersPerformance {
57
58
59
60
61
62 private int value;
63
64
65
66
67
68
69 @State(Scope.Benchmark)
70 public static class Sources extends RandomSources {
71
72 private static final double[] DISCRETE_PROBABILITIES;
73
74 static {
75
76
77
78
79
80 final int size = (32 + 64) / 2;
81 DISCRETE_PROBABILITIES = new double[size];
82 for (int i = 0; i < size; i++) {
83 DISCRETE_PROBABILITIES[i] = (i + 1.0) / size;
84 }
85 }
86
87
88
89
90 @Param({"DiscreteUniformSampler",
91 "RejectionInversionZipfSampler",
92 "SmallMeanPoissonSampler",
93 "LargeMeanPoissonSampler",
94 "GeometricSampler",
95 "MarsagliaTsangWangDiscreteSampler",
96 "MarsagliaTsangWangPoissonSampler",
97 "MarsagliaTsangWangBinomialSampler",
98 "GuideTableDiscreteSampler",
99 "AliasMethodDiscreteSampler"})
100 private String samplerType;
101
102
103 private DiscreteSampler sampler;
104
105
106
107
108 public DiscreteSampler getSampler() {
109 return sampler;
110 }
111
112
113 @Override
114 @Setup
115 public void setup() {
116 super.setup();
117 final UniformRandomProvider rng = getGenerator();
118 if ("DiscreteUniformSampler".equals(samplerType)) {
119 sampler = DiscreteUniformSampler.of(rng, -98, 76);
120 } else if ("RejectionInversionZipfSampler".equals(samplerType)) {
121 sampler = RejectionInversionZipfSampler.of(rng, 43, 2.1);
122 } else if ("SmallMeanPoissonSampler".equals(samplerType)) {
123 sampler = SmallMeanPoissonSampler.of(rng, 8.9);
124 } else if ("LargeMeanPoissonSampler".equals(samplerType)) {
125
126 sampler = LargeMeanPoissonSampler.of(rng, 41.7);
127 } else if ("GeometricSampler".equals(samplerType)) {
128 sampler = GeometricSampler.of(rng, 0.21);
129 } else if ("MarsagliaTsangWangDiscreteSampler".equals(samplerType)) {
130 sampler = MarsagliaTsangWangDiscreteSampler.Enumerated.of(rng, DISCRETE_PROBABILITIES);
131 } else if ("MarsagliaTsangWangPoissonSampler".equals(samplerType)) {
132 sampler = MarsagliaTsangWangDiscreteSampler.Poisson.of(rng, 8.9);
133 } else if ("MarsagliaTsangWangBinomialSampler".equals(samplerType)) {
134 sampler = MarsagliaTsangWangDiscreteSampler.Binomial.of(rng, 20, 0.33);
135 } else if ("GuideTableDiscreteSampler".equals(samplerType)) {
136 sampler = GuideTableDiscreteSampler.of(rng, DISCRETE_PROBABILITIES);
137 } else if ("AliasMethodDiscreteSampler".equals(samplerType)) {
138 sampler = AliasMethodDiscreteSampler.of(rng, DISCRETE_PROBABILITIES);
139 }
140 }
141 }
142
143
144
145
146
147
148
149
150 @Benchmark
151 public int baseline() {
152 return value;
153 }
154
155
156
157
158
159
160
161 @Benchmark
162 public int sample(Sources sources) {
163 return sources.getSampler().sample();
164 }
165 }