Use zero-copy decoding for reflists

Reflists are basically stored as arrays of strings, which are quite
space-efficient in MessagePack. Thus, using zero-copy decoding results
in nice performance and memory savings, because the overhead of separate
allocations ends up far exceeding the overhead of the original slice.

With the included benchmark run for 20s with -benchmem, the runtime,
memory usage, and allocations go from ~740us/op, ~192KiB/op, and 4100
allocs/op to ~240us/op, ~97KiB/op, and 13 allocs/op, respectively.

Signed-off-by: Ryan Gonzalez <ryan.gonzalez@collabora.com>
This commit is contained in:
Ryan Gonzalez
2023-09-14 11:18:03 -05:00
committed by André Roth
parent 8cb1236a8c
commit 6c6d1b18ba
2 changed files with 20 additions and 1 deletions
+17
View File
@@ -28,3 +28,20 @@ func BenchmarkReflistSimpleMerge(b *testing.B) {
l.Merge(r, false, true)
}
}
func BenchmarkReflistDecode(b *testing.B) {
const count = 4096
r := NewPackageRefList()
for i := 0; i < count; i++ {
r.Refs = append(r.Refs, []byte(fmt.Sprintf("Pamd64 pkg%d %d", i, i)))
}
sort.Sort(r)
data := r.Encode()
b.ResetTimer()
for i := 0; i < b.N; i++ {
(&PackageRefList{}).Decode(data)
}
}