]> Cypherpunks.ru repositories - gostls13.git/commit
bytes: add Buffer.Available and Buffer.AvailableBuffer
authorJoe Tsai <joetsai@digital-static.net>
Mon, 6 Feb 2023 19:37:39 +0000 (11:37 -0800)
committerGopher Robot <gobot@golang.org>
Mon, 13 Mar 2023 17:03:14 +0000 (17:03 +0000)
commite671fe0c3efc497397af3362a4b79c895fbd8bfc
tree1280acea678e3eaaa106a34e99e2b147386077b6
parentbcd8161f4e3225899981d63def53fbb09b7556d4
bytes: add Buffer.Available and Buffer.AvailableBuffer

This adds a new Buffer.AvailableBuffer method that returns
an empty buffer with a possibly non-empty capacity for use
with append-like APIs.

The typical usage pattern is something like:

b := bb.AvailableBuffer()
b = appendValue(b, v)
bb.Write(b)

It allows logic combining append-like APIs with Buffer
to avoid needing to allocate and manage buffers themselves and
allows the append-like APIs to directly write into the Buffer.

The Buffer.Write method uses the builtin copy function,
which avoids copying bytes if the source and destination are identical.
Thus, Buffer.Write is a constant-time call for this pattern.

Performance:

BenchmarkBufferAppendNoCopy  2.909 ns/op  5766942167.24 MB/s

This benchmark should only be testing the cost of bookkeeping
and never the copying of the input slice.
Thus, the MB/s should be orders of magnitude faster than RAM.

Fixes #53685

Change-Id: I0b41e54361339df309db8d03527689b123f99085
Reviewed-on: https://go-review.googlesource.com/c/go/+/474635
Run-TryBot: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Ian Lance Taylor <iant@google.com>
api/next/53685.txt [new file with mode: 0644]
src/bytes/buffer.go
src/bytes/buffer_test.go
src/bytes/example_test.go