Separate IOSource#ensure_buffer from IOSource#match.#118
Merged
Conversation
Member
|
Can we give it better name?
|
## Why?
It would affect performance to do a read check in `IOSource#match` every time,
Separate read processing from IOSource#ensure_buffer.
Use `IOSource#ensure_buffer` in the following cases:
1. at the start of pull_event
2. after a trailing '>' pattern such as `@source.match(/\s*>/um`)
## 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.278 10.986 16.430 16.941 i/s - 100.000 times in 9.729858s 9.102574s 6.086579s 5.902885s
sax 30.166 30.496 49.851 51.596 i/s - 100.000 times in 3.315008s 3.279069s 2.005961s 1.938123s
pull 35.459 36.380 60.266 63.134 i/s - 100.000 times in 2.820181s 2.748745s 1.659301s 1.583928s
stream 33.762 34.636 55.173 55.859 i/s - 100.000 times in 2.961948s 2.887131s 1.812485s 1.790218s
Comparison:
dom
after(YJIT): 16.9 i/s
before(YJIT): 16.4 i/s - 1.03x slower
after: 11.0 i/s - 1.54x slower
before: 10.3 i/s - 1.65x slower
sax
after(YJIT): 51.6 i/s
before(YJIT): 49.9 i/s - 1.04x slower
after: 30.5 i/s - 1.69x slower
before: 30.2 i/s - 1.71x slower
pull
after(YJIT): 63.1 i/s
before(YJIT): 60.3 i/s - 1.05x slower
after: 36.4 i/s - 1.74x slower
before: 35.5 i/s - 1.78x slower
stream
after(YJIT): 55.9 i/s
before(YJIT): 55.2 i/s - 1.01x slower
after: 34.6 i/s - 1.61x slower
before: 33.8 i/s - 1.65x slower
```
- YJIT=ON : 1.01x - 1.05x faster
- YJIT=OFF : 1.01x - 1.06x faster
IOSource#next_read from IOSource#match.IOSource#ensure_buffer from IOSource#match.
Contributor
Author
I changed it to |
Member
|
OK. Let's use it. |
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.
Why?
It would affect performance to do a read check in
IOSource#matchevery time, Separate read processing fromIOSource#ensure_buffer.Use
IOSource#ensure_bufferin the following cases where@source.bufferis empty.'>'pattern matches, as in@source.match(/\s*>/um).Benchmark