Closed patrickfreed closed 3 years ago
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 https://github.com/rust-lang/rust/issues/87012 is the appropriate place to track it.
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 (viacargo check --tests
). Using-Zself-profile
, it was determined that nearly all of this time was spent inevaluate_obligation
. After converting all of the#[async_trait]
s and their implementations to vanilla traits that returnedBoxFuture
manually, theevaluate_obligation
portion of the compilation time was almost completely eliminated.For more context, see https://github.com/rust-lang/rust/issues/87012#issuecomment-881735995.
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.