Skip to content

Commit a0849b9

Browse files
author
Lee Rhodes
committed
2 parents 8290725 + e126191 commit a0849b9

4 files changed

Lines changed: 332 additions & 0 deletions

File tree

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package com.yahoo.sketches.benchmark;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
/**
7+
*/
8+
public class BenchmarkMain
9+
{
10+
public static void main(String[] args)
11+
{
12+
List<SketchBenchmark> benchmarks = new ArrayList<SketchBenchmark>(){{
13+
this.add(new ThetaBenchmark(13));
14+
this.add(new ThetaMemoryBenchmark(13));
15+
}};
16+
17+
runBenchmarks(benchmarks, 20, 300, powerLawDistribution);
18+
}
19+
20+
private static void runBenchmarks(
21+
List<SketchBenchmark> benchmarks,
22+
int increment,
23+
int numTimes,
24+
List<SketchBenchmark.Spec> distribution
25+
)
26+
{
27+
int numSketches = 0;
28+
for (SketchBenchmark.Spec spec : distribution) {
29+
numSketches += spec.getNumSketches();
30+
}
31+
32+
for (SketchBenchmark benchmark : benchmarks) {
33+
System.out.printf("Starting benchmark[%s]%n", benchmark);
34+
long start = System.currentTimeMillis();
35+
benchmark.setup(numSketches, powerLawDistribution);
36+
System.out.printf("benchmark[%s] setup done in %,d millis.%n", benchmark, System.currentTimeMillis() - start);
37+
start = System.currentTimeMillis();
38+
benchmark.runNTimes(increment);
39+
System.out.printf("benchmark[%s] priming[%s] done in %,d millis.%n", benchmark, increment, System.currentTimeMillis() - start);
40+
doGC();
41+
42+
43+
for (int i = 0; i < numTimes; i+=increment) {
44+
start = System.currentTimeMillis();
45+
benchmark.runNTimes(increment);
46+
long time = System.currentTimeMillis() - start;
47+
System.out.printf(
48+
"Benchmark[%s], %,d runs => %,d millis (%,d ms/run), %,d/sec%n",
49+
benchmark,
50+
i + increment,
51+
time,
52+
(int) (time / (double) increment),
53+
(int) ((1000 / (time / (double) increment)) * numSketches)
54+
);
55+
doGC();
56+
}
57+
System.out.printf("Done with benchmark[%s]%n", benchmark);
58+
}
59+
}
60+
61+
private static void doGC()
62+
{
63+
for (int i = 0; i < 10; ++i) {
64+
System.gc();
65+
}
66+
}
67+
68+
69+
public static List<SketchBenchmark.Spec> powerLawDistribution = new ArrayList<SketchBenchmark.Spec>(){{
70+
this.add(new SketchBenchmark.Spec(0, 44129));
71+
this.add(new SketchBenchmark.Spec(1, 431561));
72+
this.add(new SketchBenchmark.Spec(2, 129063));
73+
this.add(new SketchBenchmark.Spec(3, 64821));
74+
this.add(new SketchBenchmark.Spec(4, 67522));
75+
this.add(new SketchBenchmark.Spec(6, 20291));
76+
this.add(new SketchBenchmark.Spec(7, 15767));
77+
this.add(new SketchBenchmark.Spec(8, 22975));
78+
this.add(new SketchBenchmark.Spec(11, 22441));
79+
this.add(new SketchBenchmark.Spec(14, 14531));
80+
this.add(new SketchBenchmark.Spec(17, 13472));
81+
this.add(new SketchBenchmark.Spec(22, 13253));
82+
this.add(new SketchBenchmark.Spec(28, 9002));
83+
this.add(new SketchBenchmark.Spec(35, 8406));
84+
this.add(new SketchBenchmark.Spec(45, 7618));
85+
this.add(new SketchBenchmark.Spec(57, 6349));
86+
this.add(new SketchBenchmark.Spec(71, 5194));
87+
this.add(new SketchBenchmark.Spec(89, 4524));
88+
this.add(new SketchBenchmark.Spec(112, 4032));
89+
this.add(new SketchBenchmark.Spec(141, 3397));
90+
this.add(new SketchBenchmark.Spec(178, 2935));
91+
this.add(new SketchBenchmark.Spec(224, 2516));
92+
this.add(new SketchBenchmark.Spec(282, 2118));
93+
this.add(new SketchBenchmark.Spec(355, 1825));
94+
this.add(new SketchBenchmark.Spec(447, 1527));
95+
this.add(new SketchBenchmark.Spec(561, 1269));
96+
this.add(new SketchBenchmark.Spec(709, 1088));
97+
this.add(new SketchBenchmark.Spec(890, 900));
98+
this.add(new SketchBenchmark.Spec(1118, 767));
99+
this.add(new SketchBenchmark.Spec(1410, 654));
100+
this.add(new SketchBenchmark.Spec(1776, 550));
101+
this.add(new SketchBenchmark.Spec(2246, 469));
102+
this.add(new SketchBenchmark.Spec(2813, 353));
103+
this.add(new SketchBenchmark.Spec(3552, 325));
104+
this.add(new SketchBenchmark.Spec(4472, 252));
105+
this.add(new SketchBenchmark.Spec(5639, 249));
106+
this.add(new SketchBenchmark.Spec(7022, 187));
107+
this.add(new SketchBenchmark.Spec(8952, 150));
108+
this.add(new SketchBenchmark.Spec(11270, 138));
109+
this.add(new SketchBenchmark.Spec(14198, 106));
110+
this.add(new SketchBenchmark.Spec(17544, 74));
111+
this.add(new SketchBenchmark.Spec(22145, 81));
112+
this.add(new SketchBenchmark.Spec(27848, 50));
113+
this.add(new SketchBenchmark.Spec(35319, 58));
114+
this.add(new SketchBenchmark.Spec(44267, 33));
115+
this.add(new SketchBenchmark.Spec(55292, 22));
116+
this.add(new SketchBenchmark.Spec(72264, 10));
117+
this.add(new SketchBenchmark.Spec(88903, 13));
118+
this.add(new SketchBenchmark.Spec(111538, 12));
119+
this.add(new SketchBenchmark.Spec(136481, 11));
120+
this.add(new SketchBenchmark.Spec(178605, 6));
121+
this.add(new SketchBenchmark.Spec(215707, 5));
122+
this.add(new SketchBenchmark.Spec(273075, 5));
123+
this.add(new SketchBenchmark.Spec(362878, 5));
124+
this.add(new SketchBenchmark.Spec(546015, 1));
125+
this.add(new SketchBenchmark.Spec(1106004, 2));
126+
this.add(new SketchBenchmark.Spec(1766259, 2));
127+
}};
128+
129+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.yahoo.sketches.benchmark;
2+
3+
import java.util.List;
4+
5+
/**
6+
*/
7+
public interface SketchBenchmark
8+
{
9+
public void setup(int numSketches, List<Spec> specs);
10+
public void runNTimes(int n);
11+
public void reset();
12+
13+
public class Spec {
14+
private final int numSketches;
15+
private final long numEntries;
16+
17+
public Spec(long numEntries, int numSketches) {
18+
19+
this.numSketches = numSketches;
20+
this.numEntries = numEntries;
21+
}
22+
23+
public int getNumSketches()
24+
{
25+
return numSketches;
26+
}
27+
28+
public long getNumEntries()
29+
{
30+
return numEntries;
31+
}
32+
}
33+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package com.yahoo.sketches.benchmark;
2+
3+
import com.yahoo.sketches.Family;
4+
import com.yahoo.sketches.theta.CompactSketch;
5+
import com.yahoo.sketches.theta.SetOperation;
6+
import com.yahoo.sketches.theta.Sketch;
7+
import com.yahoo.sketches.theta.Union;
8+
import com.yahoo.sketches.theta.UpdateSketch;
9+
10+
import java.util.ArrayList;
11+
import java.util.Collections;
12+
import java.util.List;
13+
import java.util.Random;
14+
15+
/**
16+
*/
17+
public class ThetaBenchmark implements SketchBenchmark
18+
{
19+
private final int nominalEntries;
20+
private final Random rand;
21+
22+
private List<CompactSketch> sketches;
23+
24+
public ThetaBenchmark(int K) {
25+
this.nominalEntries = 1 << K;
26+
this.rand = new Random(K);
27+
}
28+
29+
@Override
30+
public void setup(int numSketches, List<Spec> specs)
31+
{
32+
sketches = new ArrayList<>(numSketches);
33+
34+
for (Spec spec : specs) {
35+
for (int i = 0; i < spec.getNumSketches(); ++i) {
36+
UpdateSketch sketch = UpdateSketch.builder().build(nominalEntries);
37+
for (int j = 0; j < spec.getNumEntries(); ++j) {
38+
sketch.update(rand.nextLong());
39+
}
40+
41+
sketches.add(sketch.rebuild().compact(true, null));
42+
}
43+
}
44+
Collections.shuffle(sketches, rand);
45+
46+
int numRetained = 0;
47+
int numEstimating = 0;
48+
for (CompactSketch sketch : sketches) {
49+
numRetained += sketch.getRetainedEntries(true);
50+
if (sketch.isEstimationMode()) {
51+
++numEstimating;
52+
}
53+
}
54+
System.out.printf(
55+
"%,d entries, %,d/sketch, %,d estimating (%.2f%%)%n",
56+
numRetained, numRetained / sketches.size(), numEstimating, (100 * numEstimating) / (double) sketches.size()
57+
);
58+
}
59+
60+
@Override
61+
public void runNTimes(int n)
62+
{
63+
for (int i = 0; i < n; ++i) {
64+
Union combined = (Union) SetOperation.builder().build(nominalEntries, Family.UNION);
65+
for (Object toUnion : sketches) {
66+
combined.update((Sketch) toUnion);
67+
}
68+
}
69+
}
70+
71+
@Override
72+
public void reset()
73+
{
74+
sketches = null;
75+
}
76+
77+
@Override
78+
public String toString()
79+
{
80+
return String.format("Theta OnHeap Benchmark(nominalEntries=%s)", nominalEntries);
81+
}
82+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.yahoo.sketches.benchmark;
2+
3+
import com.yahoo.sketches.Family;
4+
import com.yahoo.sketches.memory.Memory;
5+
import com.yahoo.sketches.memory.NativeMemory;
6+
import com.yahoo.sketches.theta.SetOperation;
7+
import com.yahoo.sketches.theta.Sketch;
8+
import com.yahoo.sketches.theta.Union;
9+
import com.yahoo.sketches.theta.UpdateSketch;
10+
11+
import java.util.ArrayList;
12+
import java.util.Collections;
13+
import java.util.List;
14+
import java.util.Random;
15+
16+
/**
17+
*/
18+
public class ThetaMemoryBenchmark implements SketchBenchmark
19+
{
20+
private final int nominalEntries;
21+
private final Random rand;
22+
private final byte[] bytes;
23+
24+
private List<Memory> memories;
25+
26+
public ThetaMemoryBenchmark(int K) {
27+
this.nominalEntries = 1 << K;
28+
this.rand = new Random(K);
29+
this.bytes = new byte[Sketch.getMaxUpdateSketchBytes(nominalEntries) + 8];
30+
}
31+
32+
@Override
33+
public void setup(int numSketches, List<Spec> specs)
34+
{
35+
memories = new ArrayList<>(numSketches);
36+
37+
for (Spec spec : specs) {
38+
for (int i = 0; i < spec.getNumSketches(); ++i) {
39+
UpdateSketch sketch = UpdateSketch.builder().build(nominalEntries);
40+
for (int j = 0; j < spec.getNumEntries(); ++j) {
41+
sketch.update(rand.nextLong());
42+
}
43+
memories.add(new NativeMemory(sketch.rebuild().compact(true, null).toByteArray()));
44+
}
45+
}
46+
Collections.shuffle(memories, rand);
47+
48+
int numRetained = 0;
49+
int numEstimating = 0;
50+
for (Memory mem : memories) {
51+
Sketch sketch = Sketch.wrap(mem);
52+
numRetained += sketch.getRetainedEntries(true);
53+
if (sketch.isEstimationMode()) {
54+
++numEstimating;
55+
}
56+
}
57+
System.out.printf(
58+
"%,d entries, %,d/sketch, %,d estimating (%.2f%%)%n",
59+
numRetained, numRetained / memories.size(), numEstimating, (100 * numEstimating) / (double) memories.size()
60+
);
61+
}
62+
63+
@Override
64+
public void runNTimes(int n)
65+
{
66+
for (int i = 0; i < n; ++i) {
67+
Union combined = (Union) SetOperation
68+
.builder()
69+
.setMemory(new NativeMemory(bytes))
70+
.build(nominalEntries, Family.UNION);
71+
for (Memory toUnion : memories) {
72+
combined.update(toUnion);
73+
}
74+
}
75+
}
76+
77+
@Override
78+
public void reset()
79+
{
80+
memories = null;
81+
}
82+
83+
@Override
84+
public String toString()
85+
{
86+
return String.format("Theta Memory Benchmark(nominalEntries=%s)", nominalEntries);
87+
}
88+
}

0 commit comments

Comments
 (0)