|
@@ -7,8 +7,6 @@ package org.redkalex.benchmark;
|
|
|
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
-import java.util.concurrent.atomic.AtomicInteger;
|
|
|
-import java.util.function.Function;
|
|
|
import javax.annotation.Resource;
|
|
|
import org.redkale.net.http.*;
|
|
|
import org.redkale.service.AbstractService;
|
|
@@ -24,17 +22,17 @@ public class Service extends AbstractService {
|
|
|
|
|
|
private static final byte[] helloBytes = "Hello, world!".intern().getBytes();
|
|
|
|
|
|
- private final ThreadLocal<Random> localRandom = ThreadLocal.withInitial(Random::new);
|
|
|
+ private final Random random = new Random();
|
|
|
|
|
|
@Resource
|
|
|
private DataSource source;
|
|
|
|
|
|
- private EntityCache<CachedWorld> entityCache;
|
|
|
+ private EntityCache<CachedWorld> cache;
|
|
|
|
|
|
@Override
|
|
|
public void init(AnyValue conf) {
|
|
|
if (source instanceof DataSqlSource) {
|
|
|
- this.entityCache = ((DataSqlSource) source).loadCache(CachedWorld.class);
|
|
|
+ this.cache = ((DataSqlSource) source).loadCache(CachedWorld.class);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -50,39 +48,31 @@ public class Service extends AbstractService {
|
|
|
|
|
|
@RestMapping(name = "db")
|
|
|
public CompletableFuture<World> findWorldAsync() {
|
|
|
- return source.findAsync(World.class, 1 + localRandom.get().nextInt(10000));
|
|
|
+ return source.findAsync(World.class, randomId());
|
|
|
}
|
|
|
|
|
|
@RestMapping(name = "queries")
|
|
|
public CompletableFuture<World[]> queryWorldAsync(int q) {
|
|
|
final int size = Math.min(500, Math.max(1, q));
|
|
|
- final Random random = localRandom.get();
|
|
|
final World[] worlds = new World[size];
|
|
|
-
|
|
|
- final AtomicInteger index = new AtomicInteger();
|
|
|
- final Function<?, CompletableFuture> func = f -> source.findAsync(World.class, 1 + random.nextInt(10000))
|
|
|
- .thenAccept(v -> worlds[index.getAndIncrement()] = v);
|
|
|
- CompletableFuture future = func.apply(null);
|
|
|
- for (int i = 1; i < size; i++) {
|
|
|
- future = future.thenCompose(func);
|
|
|
+ final CompletableFuture[] futures = new CompletableFuture[size];
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ final int index = i;
|
|
|
+ futures[index] = source.findAsync(World.class, randomId()).thenAccept(v -> worlds[index] = v);
|
|
|
}
|
|
|
- return future.thenApply(v -> worlds);
|
|
|
+ return CompletableFuture.allOf(futures).thenApply(v -> worlds);
|
|
|
}
|
|
|
|
|
|
@RestMapping(name = "updates")
|
|
|
public CompletableFuture<World[]> updateWorldAsync(int q) {
|
|
|
final int size = Math.min(500, Math.max(1, q));
|
|
|
- final Random random = localRandom.get();
|
|
|
final World[] worlds = new World[size];
|
|
|
-
|
|
|
- final AtomicInteger index = new AtomicInteger();
|
|
|
- final Function<?, CompletableFuture> func = f -> source.findAsync(World.class, 1 + random.nextInt(10000))
|
|
|
- .thenAccept(v -> worlds[index.getAndIncrement()] = v.randomNumber(1 + random.nextInt(10000)));
|
|
|
- CompletableFuture future = func.apply(null);
|
|
|
- for (int i = 1; i < size; i++) {
|
|
|
- future = future.thenCompose(func);
|
|
|
+ final CompletableFuture[] futures = new CompletableFuture[size];
|
|
|
+ for (int i = 0; i < size; i++) {
|
|
|
+ final int index = i;
|
|
|
+ futures[index] = source.findAsync(World.class, randomId()).thenAccept(v -> worlds[index] = v.randomNumber(randomId()));
|
|
|
}
|
|
|
- return future.thenCompose(v -> {
|
|
|
+ return CompletableFuture.allOf(futures).thenCompose(v -> {
|
|
|
Arrays.sort(worlds);
|
|
|
return source.updateAsync(worlds);
|
|
|
}).thenApply(v -> worlds);
|
|
@@ -101,12 +91,14 @@ public class Service extends AbstractService {
|
|
|
@RestMapping(name = "cached-worlds")
|
|
|
public CachedWorld[] cachedWorlds(int q) {
|
|
|
final int size = Math.min(500, Math.max(1, q));
|
|
|
- final Random random = localRandom.get();
|
|
|
final CachedWorld[] worlds = new CachedWorld[size];
|
|
|
for (int i = 0; i < size; i++) {
|
|
|
- worlds[i] = entityCache.find(1 + random.nextInt(10000));
|
|
|
+ worlds[i] = cache.find(randomId());
|
|
|
}
|
|
|
return worlds;
|
|
|
}
|
|
|
|
|
|
+ private int randomId() {
|
|
|
+ return 1 + random.nextInt(10000);
|
|
|
+ }
|
|
|
}
|