Skip to content

Commit 8f4cb19

Browse files
committed
ALP: Pre-allocate long[] encoded buffer for double vector decodes
Reuse encoded long[] buffer across double vector decompression calls instead of allocating new long[1024] per vector. Buffer is allocated once in initFromPage and passed through to decompressDoubleVector. Float decode is intentionally left unchanged — JVM escape analysis produces better code when int[] is allocated fresh per vector call.
1 parent 05996ba commit 8f4cb19

2 files changed

Lines changed: 13 additions & 3 deletions

File tree

parquet-column/src/main/java/org/apache/parquet/column/values/alp/AlpCompression.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,12 +399,20 @@ static DoubleCompressedVector compressDoubleVector(double[] input, int count, Al
399399

400400
static void decompressDoubleVector(DoubleCompressedVector v, double[] output) {
401401
long[] encoded = new long[v.numElements];
402+
decompressDoubleVector(v, output, encoded);
403+
}
404+
405+
static void decompressDoubleVector(DoubleCompressedVector v, double[] output, long[] encodedBuffer) {
402406
if (v.bitWidth > 0) {
403-
unpackLongs(v.packedValues, v.numElements, v.bitWidth, encoded);
407+
unpackLongs(v.packedValues, v.numElements, v.bitWidth, encodedBuffer);
408+
} else {
409+
for (int i = 0; i < v.numElements; i++) {
410+
encodedBuffer[i] = 0;
411+
}
404412
}
405413

406414
for (int i = 0; i < v.numElements; i++) {
407-
long unfored = encoded[i] + v.frameOfReference;
415+
long unfored = encodedBuffer[i] + v.frameOfReference;
408416
output[i] = AlpEncoderDecoder.decodeDouble(unfored, v.exponent, v.factor);
409417
}
410418

parquet-column/src/main/java/org/apache/parquet/column/values/alp/AlpValuesReaderForDouble.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
public class AlpValuesReaderForDouble extends AlpValuesReader {
2929

3030
private double[] decodedBuffer;
31+
private long[] encodedLongBuffer;
3132

3233
@Override
3334
protected void allocateDecodedBuffer(int capacity) {
3435
this.decodedBuffer = new double[capacity];
36+
this.encodedLongBuffer = new long[capacity];
3537
}
3638

3739
@Override
@@ -54,7 +56,7 @@ private void ensureVectorDecoded(int vectorIdx) {
5456
int dataOffset = vectorOffsets[vectorIdx];
5557
AlpCompression.DoubleCompressedVector cv =
5658
AlpCompression.DoubleCompressedVector.load(rawData, dataOffset, numElements);
57-
AlpCompression.decompressDoubleVector(cv, decodedBuffer);
59+
AlpCompression.decompressDoubleVector(cv, decodedBuffer, encodedLongBuffer);
5860
decodedVectorIndex = vectorIdx;
5961
}
6062
}

0 commit comments

Comments
 (0)