-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Replace usages of bytes.Buffer with strings.Builder #14539
Conversation
Review ChecklistHello reviewers! 👋 Please follow this checklist when reviewing this Pull Request. General
Tests
Documentation
New flags
If a workflow is added or modified:
Backward compatibility
|
@@ -65,7 +65,7 @@ func (buf *Buffer) String() string { | |||
// is _not_ allocated, so modifying this buffer after calling StringUnsafe will lead | |||
// to undefined behavior. | |||
func (buf *Buffer) StringUnsafe() string { | |||
return *(*string)(unsafe.Pointer(&buf.bytes)) | |||
return unsafe.String(unsafe.SliceData(buf.bytes), len(buf.bytes)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can pull this out into a separate change, but just came across it while doing all of this, and figured it'd be good to adopt the newer convention from go1.20.
if tcase.outSQL != buf.String() { | ||
t.Errorf("%v.EncodeSQL = %q, want %q", tcase.in, buf.String(), tcase.outSQL) | ||
} | ||
buf = &bytes.Buffer{} | ||
tcase.in.EncodeASCII(buf) | ||
buf.Reset() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changed to just reset and reuse the buffer instead of creating a new one.
@@ -301,7 +300,7 @@ func registerDebugBlockProfileRate() { | |||
runtime.SetBlockProfileRate(rate) | |||
log.Infof("Set block profile rate to: %d", rate) | |||
w.Header().Set("Content-Type", "text/plain") | |||
w.Write([]byte(message)) | |||
io.WriteString(w, message) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Other places within here were using io.WriteString
, so maintained the convention.
var b strings.Builder | ||
sqlparser.EncodeValue(&b, v) | ||
bindVars[k] = b.String() | ||
buf.Reset() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Might as well reuse the buffer here.
4e04278
to
4c8b368
Compare
I went through each of these manually and eyeballed to make sure they followed the pattern of only creating the buffer and using the result of .String() after later. I didn't do everything within tests since I didn't think it was too relevant. I also unified some of the usage patterns to be `var buf strings.Builder` as opposed to `buf := new(bytes.Buffer)` etc. All of the rest of the changes were just from gofmt. I'm assuming they are fine, but I understand this adds some more noise to the diffs and might not be desired. I can look into teasing them out if that's a concern. But overall, this change should yield 1 less memory allocation since the bytes -> string is done without an extra allocation. Signed-off-by: Matt Robenolt <[email protected]>
4c8b368
to
0147a05
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These are all reasonable changes. Thanks Matt!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice work! I was wondering if we could run micro benchmarks that will show an improvement, but since these changes are all over the code base, it's probably not worth trying to run any of the ones we do have - like the sqlparser ones.
Yeah, I considered that, but figured it wasn't really worth it. It's likely an impact, but hard to quantify if it's measurable or not and would depend on the workload, etc. |
Signed-off-by: Matt Robenolt <[email protected]>
Description
I went through each of these manually and eyeballed to make sure they followed the pattern of only creating the buffer and using the result of .String() after later.
I didn't do everything within tests since I didn't think it was too relevant.
I also unified some of the usage patterns to be
var buf strings.Builder
as opposed tobuf := new(bytes.Buffer)
etc.All of the rest of the changes were just from gofmt. I'm assuming they are fine, but I understand this adds some more noise to the diffs and might not be desired. I can look into teasing them out if that's a concern.
But overall, this change should yield 1 less memory allocation since the bytes -> string is done without an extra allocation.
Related Issue(s)
Checklist
Deployment Notes