-
Notifications
You must be signed in to change notification settings - Fork 12.7k
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
Optimize seen Predicate filtering. #50932
Conversation
This speeds up a few rustc-perf benchmark runs, most notably ones involving 'coercions', the best by 2%.
r? @eddyb (rust_highfive has picked a reviewer for you, use r? to override) |
// | ||
// This code is hot enough that it's worth avoiding the allocation | ||
// required for the FxHashSet when possible. Special-casing lengths 0, | ||
// 1 and 2 covers roughly 75--80% of the cases. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about using sort + dedup? That would avoid the allocation, and also quickly exit on small numbers of elements.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That changes the order, which may break the behavior.
Also, deriving Ord is a pain.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And Predicate
is a large type, so moving the values around might be moderately expensive.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I see, the set is used with retain
. But you need to clone & move the values into a set anyway. If you want to avoid the cost of data movement, the set could be created using references into the original Vec
instead. Except that doesn't work because of the retain
...
@bors r+ |
📌 Commit 2ff6324 has been approved by |
Optimize seen Predicate filtering. This speeds up a few rustc-perf benchmark runs, most notably ones involving 'coercions', the best by 2%.
Rollup of 15 pull requests Successful merges: - #50846 (Add E0665) - #50849 (CheckLoopVisitor: also visit closure arguments) - #50863 (Make `[T]::len` and `str::len` const fn) - #50875 (rustdoc: use "short form" doc(cfg) printing even when combined with other conditionals) - #50913 (Fix typo in cell.rs) - #50914 (Issue #50636: Improve error diagnostic with missing commas after struct fields.) - #50931 (Inline `try_get`.) - #50932 (Optimize seen Predicate filtering.) - #50945 (Stabilize feature from_ref) - #50946 (rustc: Fix procedural macros generating lifetime tokens) - #50947 (rustdoc: set tab width in rust source blocks) - #50952 (Add the 2018 edition of the book to doc.rust-lang.org) - #50958 (Micro-optimization on PR#50697) - #50961 (Fix FileCheck finding with MSVC) - #50963 (Right-size the `VecDeque` in `coerce_unsized`.) Failed merges:
This speeds up a few rustc-perf benchmark runs, most notably ones
involving 'coercions', the best by 2%.