From df9b45f438ac7b2cb3de7f0011bf2aef20d52d53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serkan=20=C3=96ZAL?= Date: Mon, 29 Jan 2024 23:52:49 +0300 Subject: [PATCH] serkan-ozal's 5th submission: - use region address directly over null base memory address to get rid of extra offset calculation --- .../morling/onebrc/CalculateAverage_serkan_ozal.java | 10 ++++++---- 1 file 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 576dd0817..0ec485619 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 @@ private void doProcessRegion(MemorySegment region, long regionAddress, long regi // 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 @@ private void doProcessRegion(MemorySegment region, long regionAddress, long regi } } - 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) {