clap icon indicating copy to clipboard operation
clap copied to clipboard

Reduce compilation time

Open CreepySkeleton opened this issue 4 years ago • 5 comments

All features No features

The clap crate (not counting dependencies) takes about 11 seconds to compile. All dependencies put together take roughly the same amount of time.

I have a few thoughts on how to improve the situation. Generally, compile time wins these days are accomplished through "compile less code", hence:

  • [ ] Feature-gate #[derive(Clone, Copy, Eq...]. The features should probably be fine-grained, like impl-traits-eq enables Eq + PartialEq. Plus the "enable everything" impl-traits feature that implies all the traits.
    • [ ] Avoid using derives and use some sort of STRUCT! macro as shown here. It turns out that even built-in derives have impact on compilation time when you have lots of them, and every struct here has #[derive(Debug)].
  • [x] Optimize proc-macro-error (drop syn-mid dep). I had already done that but decided to play around a bit more and then forgot about it. Oops.
  • [ ] Make clap modular so developers could choose exactly the set of features they need and avoid compile the others. I'll crate a separate issue a bit later.

The list is probably not exhaustive...

CreepySkeleton avatar Jul 28 '20 11:07 CreepySkeleton

Hey! If you want I can tackle down the trait implementation features :) How fine-grained do you want it to be though?

mainrs avatar Jul 30 '20 11:07 mainrs

Sure, you can try, but keep in mind that the real goal is to reduce compilation time. If the measurements will show no real difference (at least half second, everything below the threshold is noise), I will say "well we tried" and move on to other ideas.

CreepySkeleton avatar Jul 31 '20 12:07 CreepySkeleton

Sure thing! Could you tell me how to managed to time the compilation? And create the visuals for it as well :)

mainrs avatar Jul 31 '20 13:07 mainrs

The invocation was

cargo clean # make sure the we build from scratch
cargo +nightly build -Z timings -p clap:3.0.0-beta.1 --features "yaml unstable"

This will create cargo-timing-<HASH>.html file that you can open in your web browser and see the adorable stats you were so excited about :) Then I uploaded the raw html on gist.github.com and linked it through gistpreview.github.io so you see the rendered version instead of raw HTML guts.

CreepySkeleton avatar Jul 31 '20 14:07 CreepySkeleton

The clap crate (not counting dependencies) takes about 11 seconds to compile

Hi @CreepySkeleton, I suppose this is a "cold" compilation of a small Hello World-style program which depends on Clap? As a developer, I would be interested in the incremental compilation time when I change my application by, e.g., adding a new command line flag.

Could you perhaps measure that as well?

mgeisler avatar Sep 14 '22 09:09 mgeisler