Reduce string allocations in scalar_scanner #399
Merged
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.
While profiling the memory usage of our app during boot, I noticed that Pysch is allocating a lot of unnecessary strings, which waste a lot of performance on GC cycles:
Out of almost 4M objects allocated in
scalar_scanner.rb
only 6% are retained.After digging a bit more, it's because the string are matched against a dozen regexps using
===
which sets the various magic variables with sub strings &MatchData
objects even though they are never used.Using the following simplified benchmark:
Before:
After:
Downside
This rely on
String#match?
which is a MRI 2.4 feature, which mean it drops MRI 2.3 support.If dropping 2.3 is a no-go, we could have two implementations of this method, and select them using
String.method_defined?(:match?)
@tenderlove any opinions on this?
I'll look for other places where allocations could be reduced.
cc @csfrancis @rafaelfranca @Edouard-chin