Skip to content

Commit 8f8a8de

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

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

cuckoofilter.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -129,15 +129,13 @@ const bytesPerBucket = bucketSize * fingerprintSizeBits / 8
129129

130130
// Encode returns a byte slice representing a Cuckoofilter.
131131
func (cf *Filter) Encode() []byte {
132-
res := new(bytes.Buffer)
133-
res.Grow(len(cf.buckets) * bytesPerBucket)
134-
132+
buf := make([]byte, 0, len(cf.buckets)*bytesPerBucket)
135133
for _, b := range cf.buckets {
136134
for _, fp := range b {
137-
binary.Write(res, binary.LittleEndian, fp)
135+
buf = binary.LittleEndian.AppendUint16(buf, uint16(fp))
138136
}
139137
}
140-
return res.Bytes()
138+
return buf
141139
}
142140

143141
// Decode returns a Cuckoofilter from a byte slice created using Encode.
@@ -156,10 +154,15 @@ func Decode(data []byte) (*Filter, error) {
156154
buckets := make([]bucket, numBuckets)
157155
reader := bytes.NewReader(data)
158156

157+
buf := make([]byte, 2)
159158
for i, b := range buckets {
160159
for j := range b {
161-
binary.Read(reader, binary.LittleEndian, &buckets[i][j])
162-
if buckets[i][j] != nullFp {
160+
if _, err := reader.Read(buf); err != nil {
161+
return nil, err
162+
}
163+
fp := fingerprint(binary.LittleEndian.Uint16(buf))
164+
if fp != nullFp {
165+
buckets[i][j] = fp
163166
count++
164167
}
165168
}

0 commit comments

Comments
 (0)