From 6b95ac6113ccbe17c951980affbba801ac8efe50 Mon Sep 17 00:00:00 2001 From: Artsiom Korzun <72259616+artsiomkorzun@users.noreply.github.com> Date: Sun, 21 Jan 2024 19:54:43 +0100 Subject: [PATCH] optimize branches (#534) --- .../CalculateAverage_artsiomkorzun.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/dev/morling/onebrc/CalculateAverage_artsiomkorzun.java b/src/main/java/dev/morling/onebrc/CalculateAverage_artsiomkorzun.java index 1373154..ca76d10 100644 --- a/src/main/java/dev/morling/onebrc/CalculateAverage_artsiomkorzun.java +++ b/src/main/java/dev/morling/onebrc/CalculateAverage_artsiomkorzun.java @@ -140,6 +140,7 @@ public class CalculateAverage_artsiomkorzun { private static final int ENTRIES = 64 * 1024; private static final int SIZE = 128 * ENTRIES; + private static final int MASK = (ENTRIES - 1) << 7; private final ByteBuffer buffer = allocate(SIZE); private final long pointer = address(buffer); @@ -261,7 +262,7 @@ public class CalculateAverage_artsiomkorzun { } private static int offset(int hash) { - return ((hash) & (ENTRIES - 1)) << 7; + return hash & MASK; } private static int next(int prev) { @@ -361,7 +362,6 @@ public class CalculateAverage_artsiomkorzun { int length; int hash; - long ptr = 0; long word = word(position); long separator = separator(word); @@ -369,7 +369,12 @@ public class CalculateAverage_artsiomkorzun { length = length(separator); word = mask(word, separator); hash = mix(word); - ptr = aggregates.find(word, hash); + long ptr = aggregates.find(word, hash); + + if (ptr != 0) { + position = update(ptr, position + length); + continue; + } } else { long word0 = word; @@ -380,7 +385,12 @@ public class CalculateAverage_artsiomkorzun { length = length(separator) + 8; word = mask(word, separator); hash = mix(word ^ word0); - ptr = aggregates.find(word0, word, hash); + long ptr = aggregates.find(word0, word, hash); + + if (ptr != 0) { + position = update(ptr, position + length); + continue; + } } else { length = 16; @@ -404,10 +414,7 @@ public class CalculateAverage_artsiomkorzun { } } - if (ptr == 0) { - ptr = aggregates.put(position, word, length, hash); - } - + long ptr = aggregates.put(position, word, length, hash); position = update(ptr, position + length); } }