(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.
This commit is contained in:
Viktor Lofgren 2023-08-31 13:52:29 +02:00
parent 03d999444d
commit f321fa5ad3
2 changed files with 27 additions and 0 deletions

View File

@ -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<IntArrayPage, IntBuffer>
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<IntArray> directRangeIfPossible(long start, long end) {
if (partitioningScheme.isSamePage(start, end)) {

View File

@ -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<LongArrayPage, LongBuff
return pages[partitioningScheme.getPage(forOffset)];
}
public ShiftedLongArray 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 ShiftedLongArray(start, end, this);
}
}
public ArrayRangeReference<LongArray> directRangeIfPossible(long start, long end) {
if (partitioningScheme.isSamePage(start, end)) {
return new ArrayRangeReference<>(