diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java index 630be2b3861..fabc69285b2 100644 --- a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java @@ -28,18 +28,18 @@ public JsonWorld(final Integer id, final Integer randomNumber) { PgClients clients; - public Uni findAsJsonWorld(final Integer id) { + public Uni findAsJsonWorld(final Tuple id) { return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1") - .execute(Tuple.of(id)) + .execute(id) .map(rowset -> { final Row row = rowset.iterator().next(); return new JsonWorld(row.getInteger(0), row.getInteger(1)); }); } - public Uni find(final Integer id) { + public Uni find(final Tuple id) { return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1") - .execute(Tuple.of(id)) + .execute(id) .map(rowset -> { final Row row = rowset.iterator().next(); return new World(row.getInteger(0), row.getInteger(1)); diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java index 4237a81f8dc..f6f83b9ff19 100644 --- a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java @@ -12,6 +12,7 @@ import io.smallrye.mutiny.Uni; import io.vertx.core.json.JsonArray; import io.vertx.ext.web.RoutingContext; +import io.vertx.mutiny.sqlclient.Tuple; import jakarta.inject.Inject; import jakarta.inject.Singleton; @@ -24,7 +25,7 @@ public class DbResource extends BaseResource { @Route(path = "db") public void db(final RoutingContext rc) { - worldRepository.findAsJsonWorld(boxedRandomWorldNumber()) + worldRepository.findAsJsonWorld(getRandomTuple()) .subscribe().with(world -> sendJson(rc, world), t -> handleFail(rc, t)); } @@ -36,7 +37,7 @@ public void queries(final RoutingContext rc) { final var ret = new JsonWorld[worlds.length]; // replace below with a for loop Arrays.setAll(worlds, i -> { - return worldRepository.findAsJsonWorld(boxedRandomWorldNumber()).map(w -> ret[i] = w); + return worldRepository.findAsJsonWorld(getRandomTuple()).map(w -> ret[i] = w); }); Uni.combine().all().unis(worlds) @@ -75,10 +76,18 @@ public void updates(final RoutingContext rc) { } private Uni randomWorld() { - return worldRepository.find(boxedRandomWorldNumber()); + return worldRepository.find(getRandomTuple()); } private static final Integer[] BOXED_RND = IntStream.range(1, 10001).boxed().toArray(Integer[]::new); + private static final Tuple[] tupleCache = new Tuple[10000]; + + static { + for (int i = 0; i < 10000; i++) { + tupleCache[i] = Tuple.of(i + 1); + } + } + private static Integer boxedRandomWorldNumber() { final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); @@ -87,6 +96,17 @@ private static Integer boxedRandomWorldNumber() { return boxedRnd; } + private static int primitiveRandomWorldNumber() { + final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); + return rndValue; + } + + private static Tuple getRandomTuple() { + final int rndValue = primitiveRandomWorldNumber(); + final Tuple tuple = tupleCache[rndValue - 1]; + return tuple; + } + private static int parseQueryCount(final String textValue) { if (textValue == null) { return 1; diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java index 3095137ae5e..e6532742720 100644 --- a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java @@ -28,6 +28,14 @@ public class WorldRepository { private PgConnectionPool connectionPool; private static final Integer[] BOXED_RND = IntStream.range(1, 10001).boxed().toArray(Integer[]::new); + private static final Tuple[] tupleCache = new Tuple[10000]; + + static { + for (int i = 0; i < 10000; i++) { + tupleCache[i] = Tuple.of(i + 1); + } + } + private static Integer boxedRandomWorldNumber() { final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); @@ -36,8 +44,20 @@ private static Integer boxedRandomWorldNumber() { return boxedRnd; } + private static int primitiveRandomWorldNumber() { + final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); + return rndValue; + } + + private static Tuple getRandomTuple() { + final int rndValue = primitiveRandomWorldNumber(); + final Tuple tuple = tupleCache[rndValue - 1]; + return tuple; + } + + public void loadRandomJsonWorld(final Handler> worldHandler) { - connectionPool.pgConnection().selectWorldQuery().execute(Tuple.of(boxedRandomWorldNumber()), randomWorldRow -> { + connectionPool.pgConnection().selectWorldQuery().execute(getRandomTuple(), randomWorldRow -> { if (randomWorldRow.succeeded()) { final RowIterator resultSet = randomWorldRow.result().iterator(); if (!resultSet.hasNext()) { @@ -101,16 +121,15 @@ private void run() { connection.rawConnection().group(c -> { final PreparedQuery> preparedQuery = c.preparedQuery(PgConnectionPool.SELECT_WORLD); for (int i = 0; i < worldsToUpdate.length; i++) { - final Integer id = boxedRandomWorldNumber(); final int index = i; - preparedQuery.execute(Tuple.of(id), worldId -> { + preparedQuery.execute(getRandomTuple(), worldId -> { if (!failed) { if (worldId.failed()) { failed = true; resultHandler.handle(Future.failedFuture(worldId.cause())); return; } - worldsToUpdate[index] = new World(worldId.result().iterator().next().getInteger(0), boxedRandomWorldNumber()); + worldsToUpdate[index] = new World(worldId.result().iterator().next().getInteger(0), primitiveRandomWorldNumber()); if (++selectWorldCompletedCount == worldsToUpdate.length) { randomWorldsQueryCompleted(); } @@ -159,7 +178,7 @@ public static void execute(final PgConnectionPool connectionPool, final int quer private void run() { connection.rawConnection().group(c -> { for (int i = 0; i < count; i++) { - c.preparedQuery(PgConnectionPool.SELECT_WORLD).execute(Tuple.of(boxedRandomWorldNumber()), this); + c.preparedQuery(PgConnectionPool.SELECT_WORLD).execute(getRandomTuple(), this); } }); } diff --git a/frameworks/Java/vertx/src/main/java/vertx/App.java b/frameworks/Java/vertx/src/main/java/vertx/App.java index 039e2ee905a..510e2ff30b9 100755 --- a/frameworks/Java/vertx/src/main/java/vertx/App.java +++ b/frameworks/Java/vertx/src/main/java/vertx/App.java @@ -92,6 +92,8 @@ static int getQueries(HttpServerRequest request) { private static final String SELECT_FORTUNE = "SELECT id, message FROM fortune"; private static final String SELECT_WORLDS = "SELECT id, randomnumber FROM world"; + private static final Tuple[] tupleCache = new Tuple[10000]; + public static CharSequence createDateHeader() { return HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); } @@ -109,6 +111,17 @@ static Integer boxedRandomWorldNumber() { return boxedRnd; } + static int primitiveRandomWorldNumber() { + final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); + return rndValue; + } + + static Tuple getRandomTuple() { + final int rndValue = primitiveRandomWorldNumber(); + final Tuple tuple = tupleCache[rndValue - 1]; + return tuple; + } + private HttpServer server; private SqlClientInternal client; private CharSequence dateString; @@ -159,6 +172,9 @@ public Future start() throws Exception { plaintextHeaders = plaintextHeaders(); jsonHeaders = jsonHeaders(); }); + for (int i = 0; i < 10000; i++) { + tupleCache[i] = Tuple.of(i + 1); + } PgConnectOptions options = new PgConnectOptions(); options.setDatabase(config.getString("database", "hello_world")); options.setHost(config.getString("host", "tfb-database")); @@ -292,7 +308,7 @@ private void handleJson(HttpServerRequest request) { private void handleDb(HttpServerRequest req) { HttpServerResponse resp = req.response(); - SELECT_WORLD_QUERY.execute(Tuple.of(boxedRandomWorldNumber())).onComplete(res -> { + SELECT_WORLD_QUERY.execute(getRandomTuple()).onComplete(res -> { if (res.succeeded()) { RowIterator resultSet = res.result().iterator(); if (!resultSet.hasNext()) { @@ -335,7 +351,7 @@ private void handle() { client.group(/*queries, */c -> { for (int i = 0; i < queries; i++) { c.preparedQuery(SELECT_WORLD) - .execute(Tuple.of(boxedRandomWorldNumber())) + .execute(getRandomTuple()) .onComplete(this); } }); @@ -382,16 +398,15 @@ public void handle() { client.group(/*worldsToUpdate.length, */c -> { final PreparedQuery> preparedQuery = c.preparedQuery(App.SELECT_WORLD); for (int i = 0; i < worldsToUpdate.length; i++) { - final Integer id = boxedRandomWorldNumber(); final int index = i; - preparedQuery.execute(Tuple.of(id)).onComplete(res -> { + preparedQuery.execute(getRandomTuple()).onComplete(res -> { if (!failed) { if (res.failed()) { failed = true; sendError(request, res.cause()); return; } - worldsToUpdate[index] = new World(res.result().iterator().next().getInteger(0), boxedRandomWorldNumber()); + worldsToUpdate[index] = new World(res.result().iterator().next().getInteger(0), primitiveRandomWorldNumber()); if (++selectWorldCompletedCount == worldsToUpdate.length) { randomWorldsQueryCompleted(); }