From 5913b51e08ecce43f69ec216505ffa20b23b0f24 Mon Sep 17 00:00:00 2001 From: rfresh2 <89827146+rfresh2@users.noreply.github.com> Date: Fri, 17 Jan 2025 14:47:06 -0800 Subject: [PATCH] improve highlight db bulk write performance --- .../highlights/ChunkHighlightDatabase.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightDatabase.java b/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightDatabase.java index 7be28633..6a89b613 100644 --- a/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightDatabase.java +++ b/common/src/main/java/xaeroplus/feature/render/highlights/ChunkHighlightDatabase.java @@ -83,15 +83,21 @@ public void insertHighlightList(final List chunks, final Res private void insertHighlightsListInternal(final List chunks, final ResourceKey dimension) { try { - try (var ps = connection.prepareStatement("INSERT OR IGNORE INTO \"" + getTableName(dimension) + "\" VALUES (?, ?, ?)")) { - for (int i = 0; i < chunks.size(); i++) { - final ChunkHighlightData chunk = chunks.get(i); - ps.setInt(1, chunk.x()); - ps.setInt(2, chunk.z()); - ps.setLong(3, chunk.foundTime()); - ps.addBatch(); + // Prepared statements is orders of magnitude slower than single insert like this + // batches even slower + // only issue is gc spam from string allocations + // could reuse this stringbuilder as this should only be called from a single thread + StringBuilder sb = new StringBuilder(50 * chunks.size() + 75); + sb.append("INSERT OR IGNORE INTO \"").append(getTableName(dimension)).append("\" VALUES "); + for (int i = 0; i < chunks.size(); i++) { + ChunkHighlightData chunk = chunks.get(i); + sb.append("(").append(chunk.x()).append(", ").append(chunk.z()).append(", ").append(chunk.foundTime()).append(")"); + if (i < chunks.size() - 1) { + sb.append(", "); } - ps.executeBatch(); + } + try (var stmt = connection.createStatement()) { + stmt.executeUpdate(sb.toString()); } } catch (Exception e) { XaeroPlus.LOGGER.error("Error inserting {} chunks into {} database in dimension: {}", chunks.size(), databaseName, dimension.location(), e);