Improving object allocation for (positional) parameter binding #1092
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
I noticed very high object allocation count with the ClickHouse Go client in our code. While with binding the parameters to a
String
this is logical to some extend, I found some easy improvements:strings.NewReplacer
, as this instance is meant to be re-used but a new instance was created all the time\?
cases, two regex replacements were nested, creating a temporary string instance that shouldn't be needed. So I changed to code to a 'simple' loop that copies byte sequences.Original object allocation:
Allocations after just changing
strings.NewReplacer
to be called once:Final result:
(of course above numbers are case specific, but for our instance this meant going from being responsible for 70% of object allocations to around 30%)
Checklist
Delete items not relevant to your PR: