aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSerkan ÖZAL <sozal@catchpoint.com>2024-01-30 00:11:27 +0300
committerGitHub <noreply@github.com>2024-01-29 22:11:27 +0100
commit5b9703283a31df9815b2f379fb483f14368ffbe5 (patch)
treeb876398ad66b23686054f9de9be46f03517d20b6 /src
parentc3510565244ede76f0ed59bf2a17ccc9a9912f96 (diff)
serkan-ozal's 5th submission: (#648)
- use region address directly over null base memory address to get rid of extra offset calculation
Diffstat (limited to 'src')
-rw-r--r--src/main/java/dev/morling/onebrc/CalculateAverage_serkan_ozal.java10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/main/java/dev/morling/onebrc/CalculateAverage_serkan_ozal.java b/src/main/java/dev/morling/onebrc/CalculateAverage_serkan_ozal.java
index 576dd08..0ec4856 100644
--- a/src/main/java/dev/morling/onebrc/CalculateAverage_serkan_ozal.java
+++ b/src/main/java/dev/morling/onebrc/CalculateAverage_serkan_ozal.java
@@ -59,8 +59,9 @@ public class CalculateAverage_serkan_ozal {
? ByteVector.SPECIES_128
: ByteVector.SPECIES_64;
private static final int BYTE_SPECIES_SIZE = BYTE_SPECIES.vectorByteSize();
-
+ private static final MemorySegment ALL = MemorySegment.NULL.reinterpret(Long.MAX_VALUE);
private static final ByteOrder NATIVE_BYTE_ORDER = ByteOrder.nativeOrder();
+
private static final char NEW_LINE_SEPARATOR = '\n';
private static final char KEY_VALUE_SEPARATOR = ';';
private static final int MAX_LINE_LENGTH = 128;
@@ -341,7 +342,7 @@ public class CalculateAverage_serkan_ozal {
// Read and process region - main
for (regionPtr = regionStart; regionPtr < regionMainLimit;) {
- regionPtr = doProcessLine(region, regionAddress, regionPtr, vectorSize);
+ regionPtr = doProcessLine(regionPtr, vectorSize);
}
// Read and process region - tail
@@ -358,13 +359,14 @@ public class CalculateAverage_serkan_ozal {
}
}
- private long doProcessLine(MemorySegment region, long regionAddress, long regionPtr, int vectorSize) {
+ private long doProcessLine(long regionPtr, int vectorSize) {
// Find key/value separator
////////////////////////////////////////////////////////////////////////////////////////////////////////
long keyStartPtr = regionPtr;
// Vectorized search for key/value separator
- ByteVector keyVector = ByteVector.fromMemorySegment(BYTE_SPECIES, region, regionPtr - regionAddress, NATIVE_BYTE_ORDER);
+ ByteVector keyVector = ByteVector.fromMemorySegment(BYTE_SPECIES, ALL, regionPtr, NATIVE_BYTE_ORDER);
+
int keyLength = keyVector.compare(VectorOperators.EQ, KEY_VALUE_SEPARATOR).firstTrue();
// Check whether key/value separator is found in the first vector (city name is <= vector size)
if (keyLength != vectorSize) {