Large number of `#[async_trait]` implementations greatly increases compile time
patrickfreed opened this issue · comments
In the test suite for the mongodb
crate, we included a large number of #[async_trait]
implementations, and this lead to roughly 1 minute of compile type for any incremental change to the tests (via cargo check --tests
). Using -Zself-profile
, it was determined that nearly all of this time was spent in evaluate_obligation
. After converting all of the #[async_trait]
s and their implementations to vanilla traits that returned BoxFuture
manually, the evaluate_obligation
portion of the compilation time was almost completely eliminated.
For more context, see rust-lang/rust#87012 (comment).
I'm not sure if this is a bug in the implementation of async_trait
or simply a limitation of doing macro-based traits, but I figured it was worth reporting here. Let me know if there's any more useful information I can provide.
https://users.rust-lang.org/t/extremely-slow-compile-times-in-test-suite/61842/2 is the right diagnosis. Something is accidentally quadratic in rustc when this kind of thing happens. If evaluate_obligation is taking nontrivial time that's a rustc bug so rust-lang/rust#87012 is the appropriate place to track it.