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.
I am using the protobuf library in a project of mine and after profiling I noticed that the majority of time serializing protobufs was occurring in these two places. I don't know if these are general enough changes that should be included in the library but thought I'd open the PR for discussion.
String#encode
is the most expensive one by far. This accounted for a significant percentage of the profile time (~36%). In my use-case the strings are already encoded in UTF-8 and therefore this isn't required. This is also the common case in crystal as all strings by default are UTF-8 encoded.After removing the string encoding in my profile I saw a large number of calls to
Hash#fetch
which stemmed from getting the wire type from::Protobuf::WIRE_TYPES
. We can move this lookup into the macro itself and have it happen at compile time rather than runtime.