-
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
Exponential compile times for nested struct with associated type and generics #105900
Comments
@rustbot label +I-compiletime |
I'm seeing similar when using a lazy state monad implemented at the type level, where each step in the binding chain introduces multiple layers of nesting to the final thunk struct. This quickly adds up: The pure functional equivalent of binding 3 ZST-tagged variables, feeding them to a function, and storing back its output compiles in ~0.5sec, but balloons up to ~150sec with a chain of twice that length. |
This ports xilem_web to the new xilem_core. There's also a lot of cleanup internally: * Get rid of all of the complex macros to support DOM interfaces, and instead use associated type bounds on the `View::Element`. * Introduce an extendable modifier based system, which should also work on top of memoization (`Arc`, `Memoize`) and `OneOf` views with an intersection of the modifiable properties. * This modifier based system gets rid of the hacky way to propagate attributes to elements, and takes inspiration by masonrys `WidgetMut` type to apply changes. * Currently that means `Attributes`, `Classes` and `Styles` to reflect what xilem_web previously offered. Downsides (currently, needs some investigation): ~~Due to more internal type complexity via associated types this suffers from rust-lang/rust#105900. The new trait solver should hopefully mitigate some of that, but it seems currently it completely stalls in the todomvc example (not in other examples).~~ ~~The deep, possibly completely static composition via associated type-bounds of the view and element tree unfortunately can take some time to compile, this gets (already) obvious in the todomvc example. The other examples don't seem to suffer that bad yet from that issue, probably because they're quite simple.~~ ~~I really hope we can mitigate this mostly, because I think this is the idiomatic (and more correct) way to implement what the previous API has offered.~~ One idea is to add a `Box<dyn AnyViewSequence>`, as every element takes a "type-erased" `ViewSequence` as parameter, so this may solve most of the issues (at the slight cost of dynamic dispatch/allocations). Edit: idea was mostly successful, see comment right below. I think it also closes #274 It's a draft, as there's a lot of changes in xilem_core that should be upstreamed (and cleaned up) via separate PRs and I would like to (mostly) fix the slow-compile time issue. --------- Co-authored-by: Daniel McNab <36049421+DJMcNab@users.noreply.github.com>
I tried this code:
And for each wrap I add, compilation times and memory usage double unexpectedly.
When I run
RUSTFLAGS="-Z time-passes" cargo check
I get this:Here's a playground where you can reproduce it:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=db81287cfac9166b22476eb739703812
I got this code by reducing a parser I was writing using the chumsky crate:
I checked some similar issues but I couldn't find the same problem I have:
This one says that it worked fine on version 1.40.0, but my code doesn't
Compile slow down against trait bound of nested structs #83341
This one uses the
return_position_impl_trait_in_trait
feature, mine doesn'tExponential compile times for chained RPITIT #102527
Meta
rustc --version --verbose
:The text was updated successfully, but these errors were encountered: