From 88b1c30db8b07a9c6af6358b553b591171527b4c Mon Sep 17 00:00:00 2001 From: Gunnar Morling Date: Thu, 4 Jan 2024 18:22:13 +0100 Subject: Leaderboard update --- .../morling/onebrc/CalculateAverage_lawrey.java | 6 ++--- .../onebrc/CalculateAverage_richardstartin.java | 31 +++++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) (limited to 'src/main/java/dev/morling/onebrc') diff --git a/src/main/java/dev/morling/onebrc/CalculateAverage_lawrey.java b/src/main/java/dev/morling/onebrc/CalculateAverage_lawrey.java index 9af272b..00242fc 100644 --- a/src/main/java/dev/morling/onebrc/CalculateAverage_lawrey.java +++ b/src/main/java/dev/morling/onebrc/CalculateAverage_lawrey.java @@ -159,7 +159,8 @@ public class CalculateAverage_lawrey { m.sample(temp / 10.0); } - } catch (IOException ioe) { + } + catch (IOException ioe) { throw new RuntimeException(ioe); } return map; @@ -169,8 +170,7 @@ public class CalculateAverage_lawrey { private static int readTemperatureFromBuffer(MappedByteBuffer mbb) { int temp = 0; boolean negative = false; - outer: - while (mbb.remaining() > 0) { + outer: while (mbb.remaining() > 0) { byte b = mbb.get(); switch (b) { case '-': diff --git a/src/main/java/dev/morling/onebrc/CalculateAverage_richardstartin.java b/src/main/java/dev/morling/onebrc/CalculateAverage_richardstartin.java index 911ecf9..0d5d2fa 100644 --- a/src/main/java/dev/morling/onebrc/CalculateAverage_richardstartin.java +++ b/src/main/java/dev/morling/onebrc/CalculateAverage_richardstartin.java @@ -87,8 +87,7 @@ public class CalculateAverage_richardstartin { private final Table table = new Table(nextBaseIndex()); - private static final AtomicIntegerFieldUpdater BASE_INDEX_UPDATER = - AtomicIntegerFieldUpdater.newUpdater(Dictionary.class, "baseIndex"); + private static final AtomicIntegerFieldUpdater BASE_INDEX_UPDATER = AtomicIntegerFieldUpdater.newUpdater(Dictionary.class, "baseIndex"); volatile int baseIndex; private void forEach(Table table, IndexedStringConsumer consumer) { @@ -120,13 +119,15 @@ public class CalculateAverage_richardstartin { if (storedKey == null) { if (row.keys.compareAndSet(c, null, slice)) { return table.index(rowIndex, c); - } else { + } + else { storedKey = row.keys.get(c); if (slice.equals(storedKey)) { return table.index(rowIndex, c); } } - } else if (slice.equals(storedKey)) { + } + else if (slice.equals(storedKey)) { return table.index(rowIndex, c); } } @@ -141,8 +142,7 @@ public class CalculateAverage_richardstartin { private static final class Row { - private static final AtomicReferenceFieldUpdater - NEXT_TABLE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(Row.class, Table.class, "next"); + private static final AtomicReferenceFieldUpdater NEXT_TABLE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(Row.class, Table.class, "next"); private final AtomicReferenceArray keys = new AtomicReferenceArray<>(CELLS); volatile Table next; @@ -152,7 +152,8 @@ public class CalculateAverage_richardstartin { Table newTable = new Table(baseIndexSupplier.getAsInt()); if (NEXT_TABLE_UPDATER.compareAndSet(this, null, newTable)) { next = newTable; - } else { + } + else { next = this.next; } } @@ -180,14 +181,16 @@ public class CalculateAverage_richardstartin { private static long compilePattern(long repeat) { return 0x101010101010101L * repeat; } + private static long compilePattern(char delimiter) { - return compilePattern (delimiter & 0xFFL); + return compilePattern(delimiter & 0xFFL); } + private static long compilePattern(byte delimiter) { return compilePattern(delimiter & 0xFFL); } - private static final long NEW_LINE = compilePattern((byte)'\n'); + private static final long NEW_LINE = compilePattern((byte) '\n'); private static final long DELIMITER = compilePattern(';'); private static int firstInstance(long word, long pattern) { @@ -311,11 +314,12 @@ public class CalculateAverage_richardstartin { for (int i = 0; i < contribution.length; i++) { if (aggregate[i] == null) { aggregate[i] = contribution[i]; - } else if (contribution[i] != null) { + } + else if (contribution[i] != null) { double[] to = aggregate[i]; double[] from = contribution[i]; // todo won't vectorise - consider separating aggregates into distinct regions and apply - // loop fission (if this shows up in the profile) + // loop fission (if this shows up in the profile) for (int j = 0; j < to.length; j += 4) { to[j] += from[j]; to[j + 1] = Math.min(to[j + 1], from[j + 1]); @@ -334,7 +338,8 @@ public class CalculateAverage_richardstartin { var slice = slices.get(min); computeSlice(slice, pages); return pages; - } else { + } + else { int mid = (min + max) / 2; var low = new AggregationTask(dictionary, slices, min, mid); var high = new AggregationTask(dictionary, slices, mid + 1, max); @@ -349,7 +354,7 @@ public class CalculateAverage_richardstartin { public static void main(String[] args) throws IOException { int maxChunkSize = 250 << 20; // 250MiB try (var raf = new RandomAccessFile(FILE, "r"); - var channel = raf.getChannel()) { + var channel = raf.getChannel()) { long size = channel.size(); // make as few mmap calls as possible subject to the 2GiB limit per buffer List rawBuffers = new ArrayList<>(); -- cgit v1.2.3