Skip to content

Commit c062d1d

Browse files
committed
Reuse slice in dod codec
1 parent e989a35 commit c062d1d

5 files changed

Lines changed: 38 additions & 39 deletions

File tree

alp/alp_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func compareFloats(a, b float64) (equal bool, relError, absError float64) {
3131
if maxAbs < 1.0 {
3232
equal = absError <= 1e-10
3333
} else {
34-
equal = relError <= 1e-11 // Slightly more tolerant than 1e-12 to account for ALP precision
34+
equal = relError <= 1e-11 // Slightly more tolerant than 1e-12 to account for ALP precision
3535
}
3636

3737
return

benchmarks/gorilla_bench_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ func BenchmarkFloats(b *testing.B) {
7474
fsc := make([]byte, numSamples*8)
7575

7676
for b.Loop() {
77-
tsc = dod.EncodeInt64(tsc[:0], ts)
78-
fsc = alp.Encode(fsc[:0], vs)
77+
tsc = dod.EncodeInt64(tsc, ts)
78+
fsc = alp.Encode(fsc, vs)
7979

8080
b.ReportMetric(float64(len(tsc)+len(fsc)), "compressed_bytes")
8181
}

dod/codec_int32.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package dod
33
import (
44
"encoding/binary"
55
"math"
6-
"slices"
76

87
"github.com/parquet-go/bitpack"
98

@@ -18,10 +17,11 @@ func EncodeInt32(dst []byte, src []int32) []byte {
1817
case 0:
1918
return dst
2019
case 1:
21-
offset := len(dst)
22-
dst = slices.Grow(dst, delta.HeaderSize)[:len(dst)+delta.HeaderSize]
23-
out := dst[offset:]
24-
delta.EncodeHeader(out, 1, int64(src[0]), 0)
20+
if cap(dst) < delta.HeaderSize {
21+
dst = make([]byte, delta.HeaderSize)
22+
}
23+
dst = dst[:delta.HeaderSize]
24+
delta.EncodeHeader(dst, 1, int64(src[0]), 0)
2525
return dst
2626
}
2727

@@ -49,15 +49,15 @@ func EncodeInt32(dst []byte, src []int32) []byte {
4949

5050
packedSize := bitpack.ByteCount(uint((len(encoded) - 1) * bitWidth))
5151
totalSize := packedSize + delta.Int32SizeBytes + delta.HeaderSize + bitpack.PaddingInt64
52-
offset := len(dst)
53-
dst = slices.Grow(dst, totalSize)[:len(dst)+totalSize]
54-
out := dst[offset:]
55-
56-
delta.EncodeHeader(out, uint16(len(src)), minVal, uint8(bitWidth))
52+
if cap(dst) < totalSize {
53+
dst = make([]byte, totalSize)
54+
}
55+
dst = dst[:totalSize]
5756

5857
// Encode the first value as int32 and bitpack the rest as int64
59-
binary.LittleEndian.PutUint32(out[delta.HeaderSize:], uint32(encoded[0]))
60-
bitpack.Pack(out[delta.HeaderSize+delta.Int32SizeBytes:], encoded[1:], uint(bitWidth))
58+
delta.EncodeHeader(dst, uint16(len(src)), minVal, uint8(bitWidth))
59+
binary.LittleEndian.PutUint32(dst[delta.HeaderSize:], uint32(encoded[0]))
60+
bitpack.Pack(dst[delta.HeaderSize+delta.Int32SizeBytes:], encoded[1:], uint(bitWidth))
6161

6262
return dst
6363
}

dod/codec_int64.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package dod
33
import (
44
"encoding/binary"
55
"math"
6-
"slices"
76

87
"github.com/parquet-go/bitpack"
98

@@ -23,10 +22,11 @@ func EncodeInt64(dst []byte, src []int64) []byte {
2322
case 0:
2423
return dst
2524
case 1:
26-
offset := len(dst)
27-
dst = slices.Grow(dst, delta.HeaderSize)[:len(dst)+delta.HeaderSize]
28-
out := dst[offset:]
29-
delta.EncodeHeader(out, 1, src[0], 0)
25+
if cap(dst) < delta.HeaderSize {
26+
dst = make([]byte, delta.HeaderSize)
27+
}
28+
dst = dst[:delta.HeaderSize]
29+
delta.EncodeHeader(dst, 1, src[0], 0)
3030
return dst
3131
}
3232

@@ -53,15 +53,15 @@ func EncodeInt64(dst []byte, src []int64) []byte {
5353

5454
packedSize := bitpack.ByteCount(uint((len(encoded) - 1) * bitWidth))
5555
totalSize := packedSize + delta.Int64SizeBytes + delta.HeaderSize + bitpack.PaddingInt64
56-
offset := len(dst)
57-
dst = slices.Grow(dst, totalSize)[:len(dst)+totalSize]
58-
out := dst[offset:]
59-
60-
delta.EncodeHeader(out, uint16(len(src)), minVal, uint8(bitWidth))
56+
if cap(dst) < totalSize {
57+
dst = make([]byte, totalSize)
58+
}
59+
dst = dst[:totalSize]
6160

61+
delta.EncodeHeader(dst, uint16(len(src)), minVal, uint8(bitWidth))
6262
// Encode the first value as is and bitpack the rest.
63-
binary.LittleEndian.PutUint64(out[delta.HeaderSize:delta.HeaderSize+delta.Int64SizeBytes], uint64(encoded[0]))
64-
bitpack.Pack(out[delta.HeaderSize+delta.Int64SizeBytes:], encoded[1:], uint(bitWidth))
63+
binary.LittleEndian.PutUint64(dst[delta.HeaderSize:delta.HeaderSize+delta.Int64SizeBytes], uint64(encoded[0]))
64+
bitpack.Pack(dst[delta.HeaderSize+delta.Int64SizeBytes:], encoded[1:], uint(bitWidth))
6565

6666
return dst
6767
}

dod/codec_uint64.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package dod
33
import (
44
"encoding/binary"
55
"math"
6-
"slices"
76

87
"github.com/parquet-go/bitpack"
98
"github.com/parquet-go/bitpack/unsafecast"
@@ -19,10 +18,11 @@ func EncodeUInt64(dst []byte, src []uint64) []byte {
1918
case 0:
2019
return dst
2120
case 1:
22-
offset := len(dst)
23-
dst = slices.Grow(dst, delta.HeaderSize)[:len(dst)+delta.HeaderSize]
24-
out := dst[offset:]
25-
delta.EncodeHeader(out, 1, int64(src[0]), 0)
21+
if cap(dst) < delta.HeaderSize {
22+
dst = make([]byte, delta.HeaderSize)
23+
}
24+
dst = dst[:delta.HeaderSize]
25+
delta.EncodeHeader(dst, 1, int64(src[0]), 0)
2626
return dst
2727
}
2828

@@ -49,15 +49,14 @@ func EncodeUInt64(dst []byte, src []uint64) []byte {
4949

5050
packedSize := bitpack.ByteCount(uint((len(encoded) - 1) * bitWidth))
5151
totalSize := packedSize + delta.Int64SizeBytes + delta.HeaderSize + bitpack.PaddingInt64
52-
offset := len(dst)
53-
dst = slices.Grow(dst, totalSize)[:len(dst)+totalSize]
54-
out := dst[offset:]
55-
56-
delta.EncodeHeader(out, uint16(len(src)), minVal, uint8(bitWidth))
52+
if cap(dst) < totalSize {
53+
dst = make([]byte, totalSize)
54+
}
5755

5856
// Encode the first value as is and bitpack the rest.
59-
binary.LittleEndian.PutUint64(out[delta.HeaderSize:delta.HeaderSize+delta.Int64SizeBytes], uint64(encoded[0]))
60-
bitpack.Pack(out[delta.HeaderSize+delta.Int64SizeBytes:], unsafecast.Slice[int64](encoded[1:]), uint(bitWidth))
57+
delta.EncodeHeader(dst, uint16(len(src)), minVal, uint8(bitWidth))
58+
binary.LittleEndian.PutUint64(dst[delta.HeaderSize:delta.HeaderSize+delta.Int64SizeBytes], uint64(encoded[0]))
59+
bitpack.Pack(dst[delta.HeaderSize+delta.Int64SizeBytes:], unsafecast.Slice[int64](encoded[1:]), uint(bitWidth))
6160

6261
return dst
6362
}

0 commit comments

Comments
 (0)