From f321fa5ad312e67e71e5eaf3b9b6b86256a82d96 Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Thu, 31 Aug 2023 13:52:29 +0200 Subject: [PATCH] (array) Override to Paging...Array$range() This is a big performance boost in array.range().get(). Without an override, each access will go through pages[page].get(...) for each get()-operation. This adds up very quickly. BTreeReader does a bunch of get():s on a range()'d array during traversal in the queryData... methods. --- .../nu/marginalia/array/page/PagingIntArray.java | 14 ++++++++++++++ .../nu/marginalia/array/page/PagingLongArray.java | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/code/libraries/array/src/main/java/nu/marginalia/array/page/PagingIntArray.java b/code/libraries/array/src/main/java/nu/marginalia/array/page/PagingIntArray.java index 0be2801c..88c7dcb1 100644 --- a/code/libraries/array/src/main/java/nu/marginalia/array/page/PagingIntArray.java +++ b/code/libraries/array/src/main/java/nu/marginalia/array/page/PagingIntArray.java @@ -6,6 +6,7 @@ import nu.marginalia.array.IntArray; import nu.marginalia.array.algo.SortingContext; import nu.marginalia.array.buffer.IntQueryBuffer; import nu.marginalia.array.delegate.ReferenceImplIntArrayDelegate; +import nu.marginalia.array.delegate.ShiftedIntArray; import nu.marginalia.array.functional.*; import nu.marginalia.array.functor.IntFolder; import nu.marginalia.array.functor.IntIOFolder; @@ -369,6 +370,19 @@ public class PagingIntArray extends AbstractPagingArray return size; } + public ShiftedIntArray range(long start, long end) { + if (partitioningScheme.isSamePage(start, end)) { + return pages[partitioningScheme.getPage(start)] + .range(partitioningScheme.getOffset(start), + partitioningScheme.getEndOffset(start, end) + ); + } + else { + return new ShiftedIntArray(start, end, this); + } + } + + @Override public ArrayRangeReference directRangeIfPossible(long start, long end) { if (partitioningScheme.isSamePage(start, end)) { diff --git a/code/libraries/array/src/main/java/nu/marginalia/array/page/PagingLongArray.java b/code/libraries/array/src/main/java/nu/marginalia/array/page/PagingLongArray.java index 0e01f1f3..57961273 100644 --- a/code/libraries/array/src/main/java/nu/marginalia/array/page/PagingLongArray.java +++ b/code/libraries/array/src/main/java/nu/marginalia/array/page/PagingLongArray.java @@ -6,6 +6,7 @@ import nu.marginalia.array.LongArray; import nu.marginalia.array.algo.SortingContext; import nu.marginalia.array.buffer.LongQueryBuffer; import nu.marginalia.array.delegate.ReferenceImplLongArrayDelegate; +import nu.marginalia.array.delegate.ShiftedLongArray; import nu.marginalia.array.functional.LongBinaryIOOperation; import nu.marginalia.array.functional.LongIOTransformer; import nu.marginalia.array.functional.LongLongConsumer; @@ -565,6 +566,18 @@ public class PagingLongArray extends AbstractPagingArray directRangeIfPossible(long start, long end) { if (partitioningScheme.isSamePage(start, end)) { return new ArrayRangeReference<>(