Reduce calls to Source#buffer(StringScanner#rest)#106
Merged
kou merged 1 commit intoruby:masterfrom Jan 20, 2024
Merged
Conversation
kou
reviewed
Jan 20, 2024
| @source.read if @source.buffer.size<2 | ||
| if @source.buffer[0] == ?< | ||
| if @source.buffer[1] == ?/ | ||
| pattern = @source.buffer[0,2] |
Member
There was a problem hiding this comment.
I think that this is not a pattern. Can we use more suitable name such as buffer and next_data?
Can we remove [0,2]? I think that it's a needless method call.
Comment on lines
+351
to
+352
| @source.read if @source.buffer.size<2 | ||
| if @source.buffer[0] == ?< | ||
| if @source.buffer[1] == ?/ | ||
| pattern = @source.buffer[0,2] |
Member
There was a problem hiding this comment.
We may want to reduce one more @source.buffer call.
pattern = @source.buffer
if pattern.size < 2
@source.read
pattern = @source.buffer
end
Contributor
Author
There was a problem hiding this comment.
It worked with this content.
Thank you!
[Why]
`Source#buffer` calling `StringScanner#rest`.
`StringScanner#rest` is slow.
Reduce calls to `Source#buffer`.
## Benchmark
```
RUBYLIB= BUNDLER_ORIG_RUBYLIB= /Users/naitoh/.rbenv/versions/3.3.0/bin/ruby -v -S benchmark-driver /Users/naitoh/ghq/github.com/naitoh/rexml/benchmark/parse.yaml
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin22]
Calculating -------------------------------------
before after before(YJIT) after(YJIT)
dom 10.639 10.985 16.213 16.221 i/s - 100.000 times in 9.399033s 9.103461s 6.167962s 6.164794s
sax 28.357 29.440 42.900 44.375 i/s - 100.000 times in 3.526479s 3.396688s 2.331024s 2.253511s
pull 32.852 34.210 48.976 51.273 i/s - 100.000 times in 3.043965s 2.923140s 2.041816s 1.950344s
stream 30.821 31.908 43.953 44.697 i/s - 100.000 times in 3.244539s 3.134020s 2.275172s 2.237310s
Comparison:
dom
after(YJIT): 16.2 i/s
before(YJIT): 16.2 i/s - 1.00x slower
after: 11.0 i/s - 1.48x slower
before: 10.6 i/s - 1.52x slower
sax
after(YJIT): 44.4 i/s
before(YJIT): 42.9 i/s - 1.03x slower
after: 29.4 i/s - 1.51x slower
before: 28.4 i/s - 1.56x slower
pull
after(YJIT): 51.3 i/s
before(YJIT): 49.0 i/s - 1.05x slower
after: 34.2 i/s - 1.50x slower
before: 32.9 i/s - 1.56x slower
stream
after(YJIT): 44.7 i/s
before(YJIT): 44.0 i/s - 1.02x slower
after: 31.9 i/s - 1.40x slower
before: 30.8 i/s - 1.45x slower
```
- YJIT=ON : 1.00x - 1.05x faster
- YJIT=OFF : 1.03x - 1.04x faster
0a51890 to
98835dd
Compare
Member
|
Thanks! |
Contributor
Author
|
Thanks! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Reduce calls to
Source#buffer(StringScanner#rest)Why
Source#buffercallingStringScanner#rest.StringScanner#restis slow.Reduce calls to
Source#buffer.Benchmark