Skip to content

Commit b2acbd1

Browse files
committed
reduce allocations during encode/decode
1 parent f90a0b9 commit b2acbd1

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

cuckoofilter.go

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cuckoo
22

33
import (
4-
"bytes"
54
"encoding/binary"
65
"fmt"
76

@@ -129,15 +128,13 @@ const bytesPerBucket = bucketSize * fingerprintSizeBits / 8
129128

130129
// Encode returns a byte slice representing a Cuckoofilter.
131130
func (cf *Filter) Encode() []byte {
132-
res := new(bytes.Buffer)
133-
res.Grow(len(cf.buckets) * bytesPerBucket)
134-
131+
buf := make([]byte, 0, len(cf.buckets)*bytesPerBucket)
135132
for _, b := range cf.buckets {
136133
for _, fp := range b {
137-
binary.Write(res, binary.LittleEndian, fp)
134+
buf = binary.LittleEndian.AppendUint16(buf, uint16(fp))
138135
}
139136
}
140-
return res.Bytes()
137+
return buf
141138
}
142139

143140
// Decode returns a Cuckoofilter from a byte slice created using Encode.
@@ -152,13 +149,13 @@ func Decode(data []byte) (*Filter, error) {
152149
if getNextPow2(uint64(numBuckets)) != uint(numBuckets) {
153150
return nil, fmt.Errorf("numBuckets must to be a power of 2, got %d", numBuckets)
154151
}
155-
var count uint
156-
buckets := make([]bucket, numBuckets)
157-
reader := bytes.NewReader(data)
158152

153+
var count, pos uint
154+
buckets := make([]bucket, numBuckets)
159155
for i, b := range buckets {
160156
for j := range b {
161-
binary.Read(reader, binary.LittleEndian, &buckets[i][j])
157+
buckets[i][j] = fingerprint(binary.LittleEndian.Uint16(data[pos : pos+2]))
158+
pos += 2
162159
if buckets[i][j] != nullFp {
163160
count++
164161
}

0 commit comments

Comments
 (0)