google / flatbuffers

FlatBuffers: Memory Efficient Serialization Library
https://flatbuffers.dev/
Apache License 2.0
22.52k stars 3.19k forks source link

[Go] add ResetKeep() and ResetBuffer() #8288

Open jdemeyer opened 2 months ago

jdemeyer commented 2 months ago

Add a function ResetKeep() which is like Reset() except that it only re-uses the unused space left in the buffer: it keeps previous data which was in the buffer. This is useful if you want to allocate 1 large buffer and use it for a bunch of flatbuffer objects.

With this change, both Reset() and ResetKeep() are now implemented in terms of a general ResetBuffer() function which allows using an arbitrary given buffer.

This also changes the behaviour of growBytesBuffer to never re-use the existing buffer: that would go against the meaning of ResetKeep(). It was an unlikely code path anyway: it could happen only if len(b.Bytes) < cap(b.Bytes) which is only possible if the user manually set b.Bytes.

The code in growBytesBuffer was also simplified and optimized: the benchmark added in https://github.com/google/flatbuffers/pull/8287 went from

BenchmarkBuildAllocations-12             2186073              1595 ns/op          81.49 MB/s         824 B/op         13 allocs/op

to

BenchmarkBuildAllocations-12             2396973              1432 ns/op          90.79 MB/s         560 B/op          6 allocs/op

on my personal laptop.