-
Notifications
You must be signed in to change notification settings - Fork 20
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 parsing performance #152
Merged
Merged
Conversation
This file contains 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
If a match is not found immediately starting from pos, match will exit early instead of scaning till the end of the source string.
This avoids adding new property (.raw) to AST node after the object is created, so the AST node is monomorphic and V8 don't have to transition to a new shape.
Also avoid mutating the return shape of string.match since the range info can be read from pos
Also introduce `consume` for previous `incr` utility. In most cases, the `incr` result is not used and the unused string slice should be avoided.
replace multiple regex matching with a big switch case.
replace multiple regex matching with a big switch case.
so that we can avoid the string protototype slice call when possible
This PR makes me very happy. Thanks @JLHwung for working on this! |
I will make a new release tonight. |
Published v0.12.0 which includes this PR. |
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.
In this PR we improve the general parsing performance.
match
helper: Previously we compared the index with the current position, which could lead to quadratic time as we are scanning the full input. In this PR we switched to a faster implementation, we also introducedmatchOne
helper so that we can skip the string prototype substring when we are only matching one characterparse*
paths: Previously we issued multiplematchReg
calls when parsing atoms. They are now replaced by a big switch case that depends on the current character.raw
property to the finished AST node, V8 will have to migrate the AST shape to a new shape with.raw
property, theaddRaw
function are now inline to AST creation so that V8 can generate the final AST node directly. Currently, thenormal
group andignore
group will be polymorphic if we have named groups / modifiers. However both of them are new features, we can improve that laterAdded a new
npm run bench
script to show the benchmark result: the baseline version is the last release and the current version is this PR. The benchmark samples are taken from multiple public npm libraries.Benchmark result