|
| 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