Skip to content

Commit e22ce4c

Browse files
authored
Merge pull request #187 from graphql-java/add-jmh
add jmh testing with one initial performance test
2 parents 8dad2ac + 8f46b37 commit e22ce4c

File tree

3 files changed

+394
-0
lines changed

3 files changed

+394
-0
lines changed

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ plugins {
1010
id 'biz.aQute.bnd.builder' version '6.2.0'
1111
id 'io.github.gradle-nexus.publish-plugin' version '1.0.0'
1212
id 'com.github.ben-manes.versions' version '0.51.0'
13+
id "me.champeau.jmh" version "0.7.3"
1314
}
1415

1516
java {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,309 @@
1+
package performance;
2+
3+
import org.dataloader.BatchLoader;
4+
import org.dataloader.DataLoader;
5+
import org.dataloader.DataLoaderFactory;
6+
import org.openjdk.jmh.annotations.Benchmark;
7+
import org.openjdk.jmh.annotations.BenchmarkMode;
8+
import org.openjdk.jmh.annotations.Fork;
9+
import org.openjdk.jmh.annotations.Measurement;
10+
import org.openjdk.jmh.annotations.Mode;
11+
import org.openjdk.jmh.annotations.OutputTimeUnit;
12+
import org.openjdk.jmh.annotations.Scope;
13+
import org.openjdk.jmh.annotations.Setup;
14+
import org.openjdk.jmh.annotations.State;
15+
import org.openjdk.jmh.annotations.Warmup;
16+
import org.openjdk.jmh.infra.Blackhole;
17+
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.concurrent.CompletableFuture;
21+
import java.util.concurrent.TimeUnit;
22+
import java.util.stream.Collectors;
23+
24+
@State(Scope.Benchmark)
25+
@Warmup(iterations = 2, time = 5)
26+
@Measurement(iterations = 4)
27+
@Fork(1)
28+
public class DataLoaderDispatchPerformance {
29+
30+
static Owner o1 = new Owner("O-1", "Andi", List.of("P-1", "P-2", "P-3"));
31+
static Owner o2 = new Owner("O-2", "George", List.of("P-4", "P-5", "P-6"));
32+
static Owner o3 = new Owner("O-3", "Peppa", List.of("P-7", "P-8", "P-9", "P-10"));
33+
static Owner o4 = new Owner("O-4", "Alice", List.of("P-11", "P-12"));
34+
static Owner o5 = new Owner("O-5", "Bob", List.of("P-13"));
35+
static Owner o6 = new Owner("O-6", "Catherine", List.of("P-14", "P-15", "P-16"));
36+
static Owner o7 = new Owner("O-7", "David", List.of("P-17"));
37+
static Owner o8 = new Owner("O-8", "Emma", List.of("P-18", "P-19", "P-20", "P-21"));
38+
static Owner o9 = new Owner("O-9", "Frank", List.of("P-22"));
39+
static Owner o10 = new Owner("O-10", "Grace", List.of("P-23", "P-24"));
40+
static Owner o11 = new Owner("O-11", "Hannah", List.of("P-25", "P-26", "P-27"));
41+
static Owner o12 = new Owner("O-12", "Ian", List.of("P-28"));
42+
static Owner o13 = new Owner("O-13", "Jane", List.of("P-29", "P-30"));
43+
static Owner o14 = new Owner("O-14", "Kevin", List.of("P-31", "P-32", "P-33"));
44+
static Owner o15 = new Owner("O-15", "Laura", List.of("P-34"));
45+
static Owner o16 = new Owner("O-16", "Michael", List.of("P-35", "P-36"));
46+
static Owner o17 = new Owner("O-17", "Nina", List.of("P-37", "P-38", "P-39", "P-40"));
47+
static Owner o18 = new Owner("O-18", "Oliver", List.of("P-41"));
48+
static Owner o19 = new Owner("O-19", "Paula", List.of("P-42", "P-43"));
49+
static Owner o20 = new Owner("O-20", "Quinn", List.of("P-44", "P-45", "P-46"));
50+
static Owner o21 = new Owner("O-21", "Rachel", List.of("P-47"));
51+
static Owner o22 = new Owner("O-22", "Steve", List.of("P-48", "P-49"));
52+
static Owner o23 = new Owner("O-23", "Tina", List.of("P-50", "P-51", "P-52"));
53+
static Owner o24 = new Owner("O-24", "Uma", List.of("P-53"));
54+
static Owner o25 = new Owner("O-25", "Victor", List.of("P-54", "P-55"));
55+
static Owner o26 = new Owner("O-26", "Wendy", List.of("P-56", "P-57", "P-58"));
56+
static Owner o27 = new Owner("O-27", "Xander", List.of("P-59"));
57+
static Owner o28 = new Owner("O-28", "Yvonne", List.of("P-60", "P-61"));
58+
static Owner o29 = new Owner("O-29", "Zach", List.of("P-62", "P-63", "P-64"));
59+
static Owner o30 = new Owner("O-30", "Willy", List.of("P-65", "P-66", "P-67"));
60+
61+
62+
static Pet p1 = new Pet("P-1", "Bella", "O-1", List.of("P-2", "P-3", "P-4"));
63+
static Pet p2 = new Pet("P-2", "Charlie", "O-2", List.of("P-1", "P-5", "P-6"));
64+
static Pet p3 = new Pet("P-3", "Luna", "O-3", List.of("P-1", "P-2", "P-7", "P-8"));
65+
static Pet p4 = new Pet("P-4", "Max", "O-1", List.of("P-1", "P-9", "P-10"));
66+
static Pet p5 = new Pet("P-5", "Lucy", "O-2", List.of("P-2", "P-6"));
67+
static Pet p6 = new Pet("P-6", "Cooper", "O-3", List.of("P-3", "P-5", "P-7"));
68+
static Pet p7 = new Pet("P-7", "Daisy", "O-1", List.of("P-4", "P-6", "P-8"));
69+
static Pet p8 = new Pet("P-8", "Milo", "O-2", List.of("P-3", "P-7", "P-9"));
70+
static Pet p9 = new Pet("P-9", "Lola", "O-3", List.of("P-4", "P-8", "P-10"));
71+
static Pet p10 = new Pet("P-10", "Rocky", "O-1", List.of("P-4", "P-9"));
72+
static Pet p11 = new Pet("P-11", "Buddy", "O-4", List.of("P-12"));
73+
static Pet p12 = new Pet("P-12", "Bailey", "O-4", List.of("P-11", "P-13"));
74+
static Pet p13 = new Pet("P-13", "Sadie", "O-5", List.of("P-12"));
75+
static Pet p14 = new Pet("P-14", "Maggie", "O-6", List.of("P-15"));
76+
static Pet p15 = new Pet("P-15", "Sophie", "O-6", List.of("P-14", "P-16"));
77+
static Pet p16 = new Pet("P-16", "Chloe", "O-6", List.of("P-15"));
78+
static Pet p17 = new Pet("P-17", "Duke", "O-7", List.of("P-18"));
79+
static Pet p18 = new Pet("P-18", "Riley", "O-8", List.of("P-17", "P-19"));
80+
static Pet p19 = new Pet("P-19", "Lilly", "O-8", List.of("P-18", "P-20"));
81+
static Pet p20 = new Pet("P-20", "Zoey", "O-8", List.of("P-19"));
82+
static Pet p21 = new Pet("P-21", "Oscar", "O-8", List.of("P-22"));
83+
static Pet p22 = new Pet("P-22", "Toby", "O-9", List.of("P-21", "P-23"));
84+
static Pet p23 = new Pet("P-23", "Ruby", "O-10", List.of("P-22"));
85+
static Pet p24 = new Pet("P-24", "Milo", "O-10", List.of("P-25"));
86+
static Pet p25 = new Pet("P-25", "Finn", "O-11", List.of("P-24", "P-26"));
87+
static Pet p26 = new Pet("P-26", "Luna", "O-11", List.of("P-25"));
88+
static Pet p27 = new Pet("P-27", "Ellie", "O-11", List.of("P-28"));
89+
static Pet p28 = new Pet("P-28", "Harley", "O-12", List.of("P-27", "P-29"));
90+
static Pet p29 = new Pet("P-29", "Penny", "O-13", List.of("P-28"));
91+
static Pet p30 = new Pet("P-30", "Hazel", "O-13", List.of("P-31"));
92+
static Pet p31 = new Pet("P-31", "Gus", "O-14", List.of("P-30", "P-32"));
93+
static Pet p32 = new Pet("P-32", "Dexter", "O-14", List.of("P-31"));
94+
static Pet p33 = new Pet("P-33", "Winnie", "O-14", List.of("P-34"));
95+
static Pet p34 = new Pet("P-34", "Murphy", "O-15", List.of("P-33", "P-35"));
96+
static Pet p35 = new Pet("P-35", "Moose", "O-16", List.of("P-34"));
97+
static Pet p36 = new Pet("P-36", "Scout", "O-16", List.of("P-37"));
98+
static Pet p37 = new Pet("P-37", "Rex", "O-17", List.of("P-36", "P-38"));
99+
static Pet p38 = new Pet("P-38", "Coco", "O-17", List.of("P-37"));
100+
static Pet p39 = new Pet("P-39", "Maddie", "O-17", List.of("P-40"));
101+
static Pet p40 = new Pet("P-40", "Archie", "O-17", List.of("P-39", "P-41"));
102+
static Pet p41 = new Pet("P-41", "Buster", "O-18", List.of("P-40"));
103+
static Pet p42 = new Pet("P-42", "Rosie", "O-19", List.of("P-43"));
104+
static Pet p43 = new Pet("P-43", "Molly", "O-19", List.of("P-42", "P-44"));
105+
static Pet p44 = new Pet("P-44", "Henry", "O-20", List.of("P-43"));
106+
static Pet p45 = new Pet("P-45", "Leo", "O-20", List.of("P-46"));
107+
static Pet p46 = new Pet("P-46", "Jack", "O-20", List.of("P-45", "P-47"));
108+
static Pet p47 = new Pet("P-47", "Zoe", "O-21", List.of("P-46"));
109+
static Pet p48 = new Pet("P-48", "Lulu", "O-22", List.of("P-49"));
110+
static Pet p49 = new Pet("P-49", "Mimi", "O-22", List.of("P-48", "P-50"));
111+
static Pet p50 = new Pet("P-50", "Nala", "O-23", List.of("P-49"));
112+
static Pet p51 = new Pet("P-51", "Simba", "O-23", List.of("P-52"));
113+
static Pet p52 = new Pet("P-52", "Teddy", "O-23", List.of("P-51", "P-53"));
114+
static Pet p53 = new Pet("P-53", "Mochi", "O-24", List.of("P-52"));
115+
static Pet p54 = new Pet("P-54", "Oreo", "O-25", List.of("P-55"));
116+
static Pet p55 = new Pet("P-55", "Peanut", "O-25", List.of("P-54", "P-56"));
117+
static Pet p56 = new Pet("P-56", "Pumpkin", "O-26", List.of("P-55"));
118+
static Pet p57 = new Pet("P-57", "Shadow", "O-26", List.of("P-58"));
119+
static Pet p58 = new Pet("P-58", "Sunny", "O-26", List.of("P-57", "P-59"));
120+
static Pet p59 = new Pet("P-59", "Thor", "O-27", List.of("P-58"));
121+
static Pet p60 = new Pet("P-60", "Willow", "O-28", List.of("P-61"));
122+
static Pet p61 = new Pet("P-61", "Zeus", "O-28", List.of("P-60", "P-62"));
123+
static Pet p62 = new Pet("P-62", "Ace", "O-29", List.of("P-61"));
124+
static Pet p63 = new Pet("P-63", "Blue", "O-29", List.of("P-64"));
125+
static Pet p64 = new Pet("P-64", "Cleo", "O-29", List.of("P-63", "P-65"));
126+
static Pet p65 = new Pet("P-65", "Dolly", "O-30", List.of("P-64"));
127+
static Pet p66 = new Pet("P-66", "Ella", "O-30", List.of("P-67"));
128+
static Pet p67 = new Pet("P-67", "Freddy", "O-30", List.of("P-66"));
129+
130+
131+
static Map<String, Owner> owners = Map.ofEntries(
132+
Map.entry(o1.id, o1),
133+
Map.entry(o2.id, o2),
134+
Map.entry(o3.id, o3),
135+
Map.entry(o4.id, o4),
136+
Map.entry(o5.id, o5),
137+
Map.entry(o6.id, o6),
138+
Map.entry(o7.id, o7),
139+
Map.entry(o8.id, o8),
140+
Map.entry(o9.id, o9),
141+
Map.entry(o10.id, o10),
142+
Map.entry(o11.id, o11),
143+
Map.entry(o12.id, o12),
144+
Map.entry(o13.id, o13),
145+
Map.entry(o14.id, o14),
146+
Map.entry(o15.id, o15),
147+
Map.entry(o16.id, o16),
148+
Map.entry(o17.id, o17),
149+
Map.entry(o18.id, o18),
150+
Map.entry(o19.id, o19),
151+
Map.entry(o20.id, o20),
152+
Map.entry(o21.id, o21),
153+
Map.entry(o22.id, o22),
154+
Map.entry(o23.id, o23),
155+
Map.entry(o24.id, o24),
156+
Map.entry(o25.id, o25),
157+
Map.entry(o26.id, o26),
158+
Map.entry(o27.id, o27),
159+
Map.entry(o28.id, o28),
160+
Map.entry(o29.id, o29),
161+
Map.entry(o30.id, o30)
162+
);
163+
static Map<String, Pet> pets = Map.ofEntries(
164+
Map.entry(p1.id, p1),
165+
Map.entry(p2.id, p2),
166+
Map.entry(p3.id, p3),
167+
Map.entry(p4.id, p4),
168+
Map.entry(p5.id, p5),
169+
Map.entry(p6.id, p6),
170+
Map.entry(p7.id, p7),
171+
Map.entry(p8.id, p8),
172+
Map.entry(p9.id, p9),
173+
Map.entry(p10.id, p10),
174+
Map.entry(p11.id, p11),
175+
Map.entry(p12.id, p12),
176+
Map.entry(p13.id, p13),
177+
Map.entry(p14.id, p14),
178+
Map.entry(p15.id, p15),
179+
Map.entry(p16.id, p16),
180+
Map.entry(p17.id, p17),
181+
Map.entry(p18.id, p18),
182+
Map.entry(p19.id, p19),
183+
Map.entry(p20.id, p20),
184+
Map.entry(p21.id, p21),
185+
Map.entry(p22.id, p22),
186+
Map.entry(p23.id, p23),
187+
Map.entry(p24.id, p24),
188+
Map.entry(p25.id, p25),
189+
Map.entry(p26.id, p26),
190+
Map.entry(p27.id, p27),
191+
Map.entry(p28.id, p28),
192+
Map.entry(p29.id, p29),
193+
Map.entry(p30.id, p30),
194+
Map.entry(p31.id, p31),
195+
Map.entry(p32.id, p32),
196+
Map.entry(p33.id, p33),
197+
Map.entry(p34.id, p34),
198+
Map.entry(p35.id, p35),
199+
Map.entry(p36.id, p36),
200+
Map.entry(p37.id, p37),
201+
Map.entry(p38.id, p38),
202+
Map.entry(p39.id, p39),
203+
Map.entry(p40.id, p40),
204+
Map.entry(p41.id, p41),
205+
Map.entry(p42.id, p42),
206+
Map.entry(p43.id, p43),
207+
Map.entry(p44.id, p44),
208+
Map.entry(p45.id, p45),
209+
Map.entry(p46.id, p46),
210+
Map.entry(p47.id, p47),
211+
Map.entry(p48.id, p48),
212+
Map.entry(p49.id, p49),
213+
Map.entry(p50.id, p50),
214+
Map.entry(p51.id, p51),
215+
Map.entry(p52.id, p52),
216+
Map.entry(p53.id, p53),
217+
Map.entry(p54.id, p54),
218+
Map.entry(p55.id, p55),
219+
Map.entry(p56.id, p56),
220+
Map.entry(p57.id, p57),
221+
Map.entry(p58.id, p58),
222+
Map.entry(p59.id, p59),
223+
Map.entry(p60.id, p60),
224+
Map.entry(p61.id, p61),
225+
Map.entry(p62.id, p62),
226+
Map.entry(p63.id, p63),
227+
Map.entry(p64.id, p64),
228+
Map.entry(p65.id, p65),
229+
Map.entry(p66.id, p66),
230+
Map.entry(p67.id, p67)
231+
);
232+
233+
static class Owner {
234+
public Owner(String id, String name, List<String> petIds) {
235+
this.id = id;
236+
this.name = name;
237+
this.petIds = petIds;
238+
}
239+
240+
String id;
241+
String name;
242+
List<String> petIds;
243+
}
244+
245+
static class Pet {
246+
public Pet(String id, String name, String ownerId, List<String> friendsIds) {
247+
this.id = id;
248+
this.name = name;
249+
this.ownerId = ownerId;
250+
this.friendsIds = friendsIds;
251+
}
252+
253+
String id;
254+
String name;
255+
String ownerId;
256+
List<String> friendsIds;
257+
}
258+
259+
260+
static BatchLoader<String, Owner> ownerBatchLoader = list -> {
261+
List<Owner> collect = list.stream().map(key -> {
262+
Owner owner = owners.get(key);
263+
return owner;
264+
}).collect(Collectors.toList());
265+
return CompletableFuture.completedFuture(collect);
266+
};
267+
static BatchLoader<String, Pet> petBatchLoader = list -> {
268+
List<Pet> collect = list.stream().map(key -> {
269+
Pet owner = pets.get(key);
270+
return owner;
271+
}).collect(Collectors.toList());
272+
return CompletableFuture.completedFuture(collect);
273+
};
274+
275+
276+
@State(Scope.Benchmark)
277+
public static class MyState {
278+
@Setup
279+
public void setup() {
280+
281+
}
282+
283+
}
284+
285+
286+
@Benchmark
287+
@BenchmarkMode(Mode.AverageTime)
288+
@OutputTimeUnit(TimeUnit.NANOSECONDS)
289+
public void loadAndDispatch(MyState myState, Blackhole blackhole) {
290+
DataLoader ownerDL = DataLoaderFactory.newDataLoader(ownerBatchLoader);
291+
DataLoader petDL = DataLoaderFactory.newDataLoader(petBatchLoader);
292+
293+
for (Owner owner : owners.values()) {
294+
ownerDL.load(owner.id);
295+
for (String petId : owner.petIds) {
296+
petDL.load(petId);
297+
for (String friendId : pets.get(petId).friendsIds) {
298+
petDL.load(friendId);
299+
}
300+
}
301+
}
302+
303+
CompletableFuture cf1 = ownerDL.dispatch();
304+
CompletableFuture cf2 = petDL.dispatch();
305+
blackhole.consume(CompletableFuture.allOf(cf1, cf2).join());
306+
}
307+
308+
309+
}

0 commit comments

Comments
 (0)