diff options
| author | Serkan ÖZAL <sozal@catchpoint.com> | 2024-01-30 00:11:27 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-29 22:11:27 +0100 |
| commit | 5b9703283a31df9815b2f379fb483f14368ffbe5 (patch) | |
| tree | b876398ad66b23686054f9de9be46f03517d20b6 /src/main | |
| parent | c3510565244ede76f0ed59bf2a17ccc9a9912f96 (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/main')
| -rw-r--r-- | src/main/java/dev/morling/onebrc/CalculateAverage_serkan_ozal.java | 10 |
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) { |
