-
Notifications
You must be signed in to change notification settings - Fork 12.8k
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
Massive compiler perf regression #31157
Comments
+1 on this (for reference output of
The issue he mentioned is #22204. This (current) may be considered duplicate of that, though, again, the problem was not of the current magnitude. The author considers boxing to help:
But, once again, it doesn't help much now. |
Ah, as well, this may be considered as a regression from stable to beta: |
Note that the obligation forest PR was merged on January 16, so it did get merged in the window in which the regression happened. |
Seems pretty likely to have to do with the obligation forest and also with the change in caching behavior that accompanied it. I can investigate some. |
Is the syntax_syntex issue related? It was always bad but now it's definitely worse. |
I can certainly confirm that this is traits-related; at least, the crate in question spends about 85% of its compilation time in |
@petevine unlikely to be related to that, but I don't know |
Seems pretty clear that the caching of sized results is no longer kicking in like it once did. This probably affects the script crate from servo too. |
e.g., we repeatedly prove that
|
triage: P-high |
…he, r=aturon Have the `ObligationForest` keep some per-tree state (or type `T`) and have it give a mutable reference for use when processing obligations. In this case, it will be a hashmap. This obviously affects the work that @soltanmm has been doing on snapshotting. I partly want to toss this out there for discussion. Fixes #31157. (The test in question goes to approx. 30s instead of 5 minutes for me.) cc #30977. cc @aturon @arielb1 @soltanmm r? @aturon who reviewed original `ObligationForest`
So, as this was fixed -- is it (the fix) going to be in the next nightly? |
Ought to be, yes. On Fri, Feb 5, 2016 at 3:25 PM, Oak notifications@github.com wrote:
|
@nikomatsakis excuse me for bothering again.
|
Good point. I've nominated the PR for backporting.
It may be possible to improve further. |
Is there any work done towards improving this further? |
@Marwes it is not backported to beta yet. |
That travis link shows a regression in Edit: Ok, that's lopsided since nightly runs benchmarking and things. I guess those timings are not usable. |
Here is a link to a build before the regression so there is still a significant slowdown. And even on nightly it fails occasionally https://travis-ci.org/Marwes/combine/jobs/109742755. |
I'm willing to re-open the issue on the basis that there is still ground to get back, even if the worst part is solved. |
triage: P-medium |
However, I'm bumping priority to medium. |
Needs to be retested and a test case added to perf.rlo cc @nrc @Mark-Simulacrum. |
Will add test case to perf.rlo later, but currently time -v yields:
So I think this issue can be considered fixed. Can someone clarify exactly what part of the compiler was being stressed? I can add this crate to perf.rlo no problem, but perhaps something better can be designed? |
I've reported this originally, and now I experience the same values as @Mark-Simulacrum. I've tested it with several nightlies over the year, and it seems it was getting better and better (from original 30 secs to 20, 15, 12 and finally 10 as of today). Feels great. Thanks to the rust team for the effort put on compiling speed optimizations! This exact issue with the example crate may be closed as solved, however the original drop in performance was caused by the introduction of Edit: Actually, the crate itself takes only 5 seconds to build, which is awesome. |
Closing in favor of rust-lang-deprecated/rustc-perf-collector#2 which tracks adding a test for this. |
Consider changing assert! to debug_assert! when it calls visit_with The perf run from rust-lang#52956 revealed that there were 3 benchmarks that benefited most from changing `assert!`s to `debug_assert!`s: - issue rust-lang#46449: avg -4.7% for -check - deeply-nested (AKA rust-lang#38528): avg -3.4% for -check - regression rust-lang#31157: avg -3.2% for -check I analyzed their fixing PRs and decided to look for potentially heavy assertions in the files they modified. I noticed that all of the non-trivial ones contained indirect calls to `visit_with()`. It might be a good idea to consider changing `assert!` to `debug_assert!` in those places in order to get the performance wins shown by the benchmarks.
Consider changing assert! to debug_assert! when it calls visit_with The perf run from rust-lang#52956 revealed that there were 3 benchmarks that benefited most from changing `assert!`s to `debug_assert!`s: - issue rust-lang#46449: avg -4.7% for -check - deeply-nested (AKA rust-lang#38528): avg -3.4% for -check - regression rust-lang#31157: avg -3.2% for -check I analyzed their fixing PRs and decided to look for potentially heavy assertions in the files they modified. I noticed that all of the non-trivial ones contained indirect calls to `visit_with()`. It might be a good idea to consider changing `assert!` to `debug_assert!` in those places in order to get the performance wins shown by the benchmarks.
First reported on Reddit here. See that post for more details and examples.
This crate has gone from a build time of 17 seconds with the compiler consuming 168MB of RAM at peak to 320 secs and 1670MB. Apparently this regression occurred somewhere between jan 15-18, and is in the current beta. The author hypothesizes that it may have to do with complex usage of traits.
The text was updated successfully, but these errors were encountered: