-
Notifications
You must be signed in to change notification settings - Fork 61
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
Improve memory allocs and speed of encoding maps by using Go 1.18+ features #468
Conversation
b82af9d
to
8c36ffb
Compare
@dinhxuanvu Thanks! I'll take a closer look this weekend. |
@dinhxuanvu @fxamacker The benchmarks shown in the issue look fantastic! The way this PR continues to support for Go 1.17 while using newer features with Go 1.20+ compiler is good. Unless I'm mistaken, it seems about 300 out of 358 lines added by this PR is existing code that's unmodified by this PR, but it shows up as new code from new contributor. E.g. git blame for encode_map_go117.go. This PR can benefit from being more clear about what lines of code were modified or remains unmodified code that's already audited/reviewed in past releases. It would help code reviews, troubleshooting/bisecting, and attributing work. |
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.
@dinhxuanvu Thanks again for opening this PR! 👍 Amazing speed/memory improvements! 🎉 Looking forward to merging this!
This PR looks good! However, the old code required this PR to use too much duplicate code.
Since the duplicated functions are large and complicated, it would best to avoid maintaining multiple versions of them.
Given this, I opened PR #473 to refactor the old code to allow this PR to provide its optimizations by implementing just 2 functions.
See encode_map_go117.go
in PR #473 for more details and please let me know if it works for you or if it requires changes.
Thanks again for this PR!
@dinhxuanvu sorry about the merge conflict and thanks for reviewing and approving PR #473! I appreciate your PR and am looking forward to merging this after it's updated! 👍 |
Since go 1.18, the reflect package introduces MapIter.SetKey and MapIter.SetValue that will do fewer memory allocation for map iteration which is frequently used for CBOR encode operation. Plus, usage of sync.Pool will further reduce memory allocation by reusing the shared memory in the pool. Lastly, the Value.SetZero method (available since go 1.20) is helpful to release memory allocation to the GC when is no longer needed. Signed-off-by: Vu Dinh <vudinh@outlook.com>
@fxamacker The PR is updated and I did the benchstats again and the result looked very much identical from what I reported in the issue. Thanks for helping with the refactoring! PTAL |
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.
Great work and thanks for updating this PR!
Not only does this PR improve memory allocs 🗜️ but it also improves speed 🚀 of encoding maps!
Description
Since go 1.18, the reflect package introduces MapIter.SetKey and MapIter.SetValue that will do fewer memory allocation for map iteration which is frequently used for CBOR encode operation. Plus, usage of sync.Pool will further reduce memory allocation by reusing the shared memory in the pool. Lastly, the Value.SetZero method (available since go 1.20) is helpful to release memory allocation to the GC when is no longer needed.
Signed-off-by: Vu Dinh vudinh@outlook.com
PR Was Proposed and Welcomed in Currently Open Issue
Checklist (for code PR only, ignore for docs PR)
Last line of each commit message should be in this format:
Signed-off-by: Firstname Lastname firstname.lastname@example.com
(see next section).
Certify the Developer's Certificate of Origin 1.1
the Developer Certificate of Origin 1.1.