Extreme long compilation time

I'm running my program with the --release flag and this takes about 460 sec of compilation. Is this normal with all of these crates?

[dependencies]
actix-web = "4"
async-std = "1.12.0"
cfonts = "1"
futures = "*"
isocountry = "0.3.2"
lazy_static = "*"
log = "0.4"
paho-mqtt = "0.12.1"
r2d2 = "0.8.10"
regex = "1"
serde_json = "1"
simple_logger = "*"
whois-rust = "1.5.1"
rand = "0.8.5"
dns-lookup = "2.0.2"
base64 = "0.21.4"
mac_address = "1.1.5"
dotenv = "0.15.0"
actix-web-httpauth = "0.8.1"

[dependencies.jsonwebtoken]
version = "9.1.0"
default-features = false
features = ["use_pem"]

[dependencies.headless_chrome]
git = "https://github.com/atroche/rust-headless-chrome"
features = ["fetch"]

[dependencies.attohttpc]
version = "0.26.1"
features = ["form", "json"]

[dependencies.redis]
version = "0.23.1"
features = ["r2d2"]

[dependencies.serde]
version = "1.0"
features = ["derive"]

[dependencies.utoipa]
version = "3.4.4"
features = ["actix_extras"]

[dependencies.utoipa-swagger-ui]
version = "3.1.5"
features = ["actix-web"]

[dependencies.sea-orm]
version = "0.12"
features = ["sqlx-postgres", "runtime-tokio-native-tls", "macros"]

That's 27 direct dependencies. The number of total transitive dependencies is probably in the high hundreds. ~8 minutes seems like a reasonable first compile time. Do note that subsequent re-compiles are incremental and are going to be much faster (a couple of seconds) if you do not modify your dependencies.

6 Likes

But why is that so much different in relation with other languages like C++?

And can I improve this compilation time?

TL;DR> with C, you typically don't compile all your libraries from source, but have various/many -dev dynamic packages/libs installed in system to allow building of your code...

How is it different?
I'm currently working on C++ which takes 40 minutes to compile from scratch. And it is not a first my project like that.
It boils down to how much code you need to compile, and each dependency adds to that.
Both C++ and Rust are known for their long compile times. Though in my personal experience Rust is not that bad.

3 Likes

It's not very different. C++ takes a ton of time to compile, too.

Ok, maybe I just remembered it wrong. I know that frameworks like Spring compiles faster and it also work with dependencies which is why I'm asking.

Spring is a Java library. Java compiles fast(er) because it doesn't perform as much compile-time optimization as LLVM under native languages does. Most of the optimization cost is paid at VM warmup/JIT time, every time you run your code.

3 Likes

That's a lot of dependencies.

If you want to know just how many transitive dependencies you are pulling in, run cargo tree.

959 lines of output from cargo tree
dependencies v0.1.0 (/private/tmp/dependencies)
├── actix-web v4.4.0
│   ├── actix-codec v0.5.1
│   │   ├── bitflags v1.3.2
│   │   ├── bytes v1.5.0
│   │   ├── futures-core v0.3.29
│   │   ├── futures-sink v0.3.29
│   │   ├── memchr v2.6.4
│   │   ├── pin-project-lite v0.2.13
│   │   ├── tokio v1.33.0
│   │   │   ├── bytes v1.5.0
│   │   │   ├── libc v0.2.149
│   │   │   ├── mio v0.8.9
│   │   │   │   ├── libc v0.2.149
│   │   │   │   └── log v0.4.20
│   │   │   │       └── value-bag v1.4.2
│   │   │   ├── num_cpus v1.16.0
│   │   │   │   └── libc v0.2.149
│   │   │   ├── parking_lot v0.12.1
│   │   │   │   ├── lock_api v0.4.11
│   │   │   │   │   └── scopeguard v1.2.0
│   │   │   │   └── parking_lot_core v0.9.9
│   │   │   │       ├── cfg-if v1.0.0
│   │   │   │       ├── libc v0.2.149
│   │   │   │       └── smallvec v1.11.1
│   │   │   ├── pin-project-lite v0.2.13
│   │   │   ├── signal-hook-registry v1.4.1
│   │   │   │   └── libc v0.2.149
│   │   │   └── socket2 v0.5.5
│   │   │       └── libc v0.2.149
│   │   ├── tokio-util v0.7.10
│   │   │   ├── bytes v1.5.0
│   │   │   ├── futures-core v0.3.29
│   │   │   ├── futures-sink v0.3.29
│   │   │   ├── pin-project-lite v0.2.13
│   │   │   ├── tokio v1.33.0 (*)
│   │   │   └── tracing v0.1.40
│   │   │       ├── log v0.4.20 (*)
│   │   │       ├── pin-project-lite v0.2.13
│   │   │       ├── tracing-attributes v0.1.27 (proc-macro)
│   │   │       │   ├── proc-macro2 v1.0.69
│   │   │       │   │   └── unicode-ident v1.0.12
│   │   │       │   ├── quote v1.0.33
│   │   │       │   │   └── proc-macro2 v1.0.69 (*)
│   │   │       │   └── syn v2.0.38
│   │   │       │       ├── proc-macro2 v1.0.69 (*)
│   │   │       │       ├── quote v1.0.33 (*)
│   │   │       │       └── unicode-ident v1.0.12
│   │   │       └── tracing-core v0.1.32
│   │   │           └── once_cell v1.18.0
│   │   └── tracing v0.1.40 (*)
│   ├── actix-http v3.4.0
│   │   ├── actix-codec v0.5.1 (*)
│   │   ├── actix-rt v2.9.0
│   │   │   ├── futures-core v0.3.29
│   │   │   └── tokio v1.33.0 (*)
│   │   ├── actix-service v2.0.2
│   │   │   ├── futures-core v0.3.29
│   │   │   ├── paste v1.0.14 (proc-macro)
│   │   │   └── pin-project-lite v0.2.13
│   │   ├── actix-utils v3.0.1
│   │   │   ├── local-waker v0.1.4
│   │   │   └── pin-project-lite v0.2.13
│   │   ├── ahash v0.8.6
│   │   │   ├── cfg-if v1.0.0
│   │   │   ├── getrandom v0.2.10
│   │   │   │   ├── cfg-if v1.0.0
│   │   │   │   └── libc v0.2.149
│   │   │   ├── once_cell v1.18.0
│   │   │   └── zerocopy v0.7.20
│   │   ├── base64 v0.21.5
│   │   ├── bitflags v2.4.1
│   │   ├── brotli v3.4.0
│   │   │   ├── alloc-no-stdlib v2.0.4
│   │   │   ├── alloc-stdlib v0.2.2
│   │   │   │   └── alloc-no-stdlib v2.0.4
│   │   │   └── brotli-decompressor v2.5.1
│   │   │       ├── alloc-no-stdlib v2.0.4
│   │   │       └── alloc-stdlib v0.2.2 (*)
│   │   ├── bytes v1.5.0
│   │   ├── bytestring v1.3.1
│   │   │   └── bytes v1.5.0
│   │   ├── derive_more v0.99.17 (proc-macro)
│   │   │   ├── convert_case v0.4.0
│   │   │   ├── proc-macro2 v1.0.69 (*)
│   │   │   ├── quote v1.0.33 (*)
│   │   │   └── syn v1.0.109
│   │   │       ├── proc-macro2 v1.0.69 (*)
│   │   │       ├── quote v1.0.33 (*)
│   │   │       └── unicode-ident v1.0.12
│   │   ├── encoding_rs v0.8.33
│   │   │   └── cfg-if v1.0.0
│   │   ├── flate2 v1.0.28
│   │   │   ├── crc32fast v1.3.2
│   │   │   │   └── cfg-if v1.0.0
│   │   │   └── miniz_oxide v0.7.1
│   │   │       └── adler v1.0.2
│   │   ├── futures-core v0.3.29
│   │   ├── h2 v0.3.21
│   │   │   ├── bytes v1.5.0
│   │   │   ├── fnv v1.0.7
│   │   │   ├── futures-core v0.3.29
│   │   │   ├── futures-sink v0.3.29
│   │   │   ├── futures-util v0.3.29
│   │   │   │   ├── futures-channel v0.3.29
│   │   │   │   │   ├── futures-core v0.3.29
│   │   │   │   │   └── futures-sink v0.3.29
│   │   │   │   ├── futures-core v0.3.29
│   │   │   │   ├── futures-io v0.3.29
│   │   │   │   ├── futures-macro v0.3.29 (proc-macro)
│   │   │   │   │   ├── proc-macro2 v1.0.69 (*)
│   │   │   │   │   ├── quote v1.0.33 (*)
│   │   │   │   │   └── syn v2.0.38 (*)
│   │   │   │   ├── futures-sink v0.3.29
│   │   │   │   ├── futures-task v0.3.29
│   │   │   │   ├── memchr v2.6.4
│   │   │   │   ├── pin-project-lite v0.2.13
│   │   │   │   ├── pin-utils v0.1.0
│   │   │   │   └── slab v0.4.9
│   │   │   ├── http v0.2.9
│   │   │   │   ├── bytes v1.5.0
│   │   │   │   ├── fnv v1.0.7
│   │   │   │   └── itoa v1.0.9
│   │   │   ├── indexmap v1.9.3
│   │   │   │   └── hashbrown v0.12.3
│   │   │   ├── slab v0.4.9
│   │   │   ├── tokio v1.33.0 (*)
│   │   │   ├── tokio-util v0.7.10 (*)
│   │   │   └── tracing v0.1.40 (*)
│   │   ├── http v0.2.9 (*)
│   │   ├── httparse v1.8.0
│   │   ├── httpdate v1.0.3
│   │   ├── itoa v1.0.9
│   │   ├── language-tags v0.3.2
│   │   ├── local-channel v0.1.5
│   │   │   ├── futures-core v0.3.29
│   │   │   ├── futures-sink v0.3.29
│   │   │   └── local-waker v0.1.4
│   │   ├── mime v0.3.17
│   │   ├── percent-encoding v2.3.0
│   │   ├── pin-project-lite v0.2.13
│   │   ├── rand v0.8.5
│   │   │   ├── libc v0.2.149
│   │   │   ├── rand_chacha v0.3.1
│   │   │   │   ├── ppv-lite86 v0.2.17
│   │   │   │   └── rand_core v0.6.4
│   │   │   │       └── getrandom v0.2.10 (*)
│   │   │   └── rand_core v0.6.4 (*)
│   │   ├── sha1 v0.10.6
│   │   │   ├── cfg-if v1.0.0
│   │   │   ├── cpufeatures v0.2.11
│   │   │   │   └── libc v0.2.149
│   │   │   └── digest v0.10.7
│   │   │       ├── block-buffer v0.10.4
│   │   │       │   └── generic-array v0.14.7
│   │   │       │       └── typenum v1.17.0
│   │   │       ├── crypto-common v0.1.6
│   │   │       │   ├── generic-array v0.14.7 (*)
│   │   │       │   └── typenum v1.17.0
│   │   │       └── subtle v2.5.0
│   │   ├── smallvec v1.11.1
│   │   ├── tokio v1.33.0 (*)
│   │   ├── tokio-util v0.7.10 (*)
│   │   ├── tracing v0.1.40 (*)
│   │   └── zstd v0.12.4
│   │       └── zstd-safe v6.0.6
│   │           ├── libc v0.2.149
│   │           └── zstd-sys v2.0.9+zstd.1.5.5
│   ├── actix-macros v0.2.4 (proc-macro)
│   │   ├── quote v1.0.33 (*)
│   │   └── syn v2.0.38 (*)
│   ├── actix-router v0.5.1
│   │   ├── bytestring v1.3.1 (*)
│   │   ├── http v0.2.9 (*)
│   │   ├── regex v1.10.2
│   │   │   ├── aho-corasick v1.1.2
│   │   │   │   └── memchr v2.6.4
│   │   │   ├── memchr v2.6.4
│   │   │   ├── regex-automata v0.4.3
│   │   │   │   ├── aho-corasick v1.1.2 (*)
│   │   │   │   ├── memchr v2.6.4
│   │   │   │   └── regex-syntax v0.8.2
│   │   │   └── regex-syntax v0.8.2
│   │   ├── serde v1.0.190
│   │   │   └── serde_derive v1.0.190 (proc-macro)
│   │   │       ├── proc-macro2 v1.0.69 (*)
│   │   │       ├── quote v1.0.33 (*)
│   │   │       └── syn v2.0.38 (*)
│   │   └── tracing v0.1.40 (*)
│   ├── actix-rt v2.9.0 (*)
│   ├── actix-server v2.3.0
│   │   ├── actix-rt v2.9.0 (*)
│   │   ├── actix-service v2.0.2 (*)
│   │   ├── actix-utils v3.0.1 (*)
│   │   ├── futures-core v0.3.29
│   │   ├── futures-util v0.3.29 (*)
│   │   ├── mio v0.8.9 (*)
│   │   ├── socket2 v0.5.5 (*)
│   │   ├── tokio v1.33.0 (*)
│   │   └── tracing v0.1.40 (*)
│   ├── actix-service v2.0.2 (*)
│   ├── actix-utils v3.0.1 (*)
│   ├── actix-web-codegen v4.2.2 (proc-macro)
│   │   ├── actix-router v0.5.1 (*)
│   │   ├── proc-macro2 v1.0.69 (*)
│   │   ├── quote v1.0.33 (*)
│   │   └── syn v2.0.38 (*)
│   ├── ahash v0.8.6 (*)
│   ├── bytes v1.5.0
│   ├── bytestring v1.3.1 (*)
│   ├── cfg-if v1.0.0
│   ├── cookie v0.16.2
│   │   ├── percent-encoding v2.3.0
│   │   └── time v0.3.30
│   │       ├── deranged v0.3.9
│   │       │   ├── powerfmt v0.2.0
│   │       │   └── serde v1.0.190 (*)
│   │       ├── itoa v1.0.9
│   │       ├── libc v0.2.149
│   │       ├── num_threads v0.1.6
│   │       │   └── libc v0.2.149
│   │       ├── powerfmt v0.2.0
│   │       ├── serde v1.0.190 (*)
│   │       ├── time-core v0.1.2
│   │       └── time-macros v0.2.15 (proc-macro)
│   │           └── time-core v0.1.2
│   ├── derive_more v0.99.17 (proc-macro) (*)
│   ├── encoding_rs v0.8.33 (*)
│   ├── futures-core v0.3.29
│   ├── futures-util v0.3.29 (*)
│   ├── itoa v1.0.9
│   ├── language-tags v0.3.2
│   ├── log v0.4.20 (*)
│   ├── mime v0.3.17
│   ├── once_cell v1.18.0
│   ├── pin-project-lite v0.2.13
│   ├── regex v1.10.2 (*)
│   ├── serde v1.0.190 (*)
│   ├── serde_json v1.0.108
│   │   ├── itoa v1.0.9
│   │   ├── ryu v1.0.15
│   │   └── serde v1.0.190 (*)
│   ├── serde_urlencoded v0.7.1
│   │   ├── form_urlencoded v1.2.0
│   │   │   └── percent-encoding v2.3.0
│   │   ├── itoa v1.0.9
│   │   ├── ryu v1.0.15
│   │   └── serde v1.0.190 (*)
│   ├── smallvec v1.11.1
│   ├── socket2 v0.5.5 (*)
│   ├── time v0.3.30 (*)
│   └── url v2.4.1
│       ├── form_urlencoded v1.2.0 (*)
│       ├── idna v0.4.0
│       │   ├── unicode-bidi v0.3.13
│       │   └── unicode-normalization v0.1.22
│       │       └── tinyvec v1.6.0
│       │           └── tinyvec_macros v0.1.1
│       └── percent-encoding v2.3.0
├── actix-web-httpauth v0.8.1
│   ├── actix-utils v3.0.1 (*)
│   ├── actix-web v4.4.0 (*)
│   ├── base64 v0.21.5
│   ├── futures-core v0.3.29
│   ├── futures-util v0.3.29 (*)
│   ├── log v0.4.20 (*)
│   └── pin-project-lite v0.2.13
├── async-std v1.12.0
│   ├── async-channel v1.9.0
│   │   ├── concurrent-queue v2.3.0
│   │   │   └── crossbeam-utils v0.8.16
│   │   │       └── cfg-if v1.0.0
│   │   ├── event-listener v2.5.3
│   │   └── futures-core v0.3.29
│   ├── async-global-executor v2.3.1
│   │   ├── async-channel v1.9.0 (*)
│   │   ├── async-executor v1.6.0
│   │   │   ├── async-lock v2.8.0
│   │   │   │   └── event-listener v2.5.3
│   │   │   ├── async-task v4.5.0
│   │   │   ├── concurrent-queue v2.3.0 (*)
│   │   │   ├── fastrand v2.0.1
│   │   │   ├── futures-lite v1.13.0
│   │   │   │   ├── fastrand v1.9.0
│   │   │   │   ├── futures-core v0.3.29
│   │   │   │   ├── futures-io v0.3.29
│   │   │   │   ├── memchr v2.6.4
│   │   │   │   ├── parking v2.2.0
│   │   │   │   ├── pin-project-lite v0.2.13
│   │   │   │   └── waker-fn v1.1.1
│   │   │   └── slab v0.4.9
│   │   ├── async-io v1.13.0
│   │   │   ├── async-lock v2.8.0 (*)
│   │   │   ├── cfg-if v1.0.0
│   │   │   ├── concurrent-queue v2.3.0 (*)
│   │   │   ├── futures-lite v1.13.0 (*)
│   │   │   ├── log v0.4.20 (*)
│   │   │   ├── parking v2.2.0
│   │   │   ├── polling v2.8.0
│   │   │   │   ├── cfg-if v1.0.0
│   │   │   │   ├── libc v0.2.149
│   │   │   │   └── log v0.4.20 (*)
│   │   │   ├── rustix v0.37.27
│   │   │   │   ├── bitflags v1.3.2
│   │   │   │   ├── errno v0.3.5
│   │   │   │   │   └── libc v0.2.149
│   │   │   │   ├── io-lifetimes v1.0.11
│   │   │   │   │   └── libc v0.2.149
│   │   │   │   └── libc v0.2.149
│   │   │   ├── slab v0.4.9
│   │   │   ├── socket2 v0.4.10
│   │   │   │   └── libc v0.2.149
│   │   │   └── waker-fn v1.1.1
│   │   ├── async-lock v2.8.0 (*)
│   │   ├── blocking v1.4.1
│   │   │   ├── async-channel v1.9.0 (*)
│   │   │   ├── async-lock v2.8.0 (*)
│   │   │   ├── async-task v4.5.0
│   │   │   ├── fastrand v2.0.1
│   │   │   ├── futures-io v0.3.29
│   │   │   ├── futures-lite v1.13.0 (*)
│   │   │   ├── piper v0.2.1
│   │   │   │   ├── atomic-waker v1.1.2
│   │   │   │   ├── fastrand v2.0.1
│   │   │   │   └── futures-io v0.3.29
│   │   │   └── tracing v0.1.40 (*)
│   │   ├── futures-lite v1.13.0 (*)
│   │   └── once_cell v1.18.0
│   ├── async-io v1.13.0 (*)
│   ├── async-lock v2.8.0 (*)
│   ├── crossbeam-utils v0.8.16 (*)
│   ├── futures-core v0.3.29
│   ├── futures-io v0.3.29
│   ├── futures-lite v1.13.0 (*)
│   ├── kv-log-macro v1.0.7
│   │   └── log v0.4.20 (*)
│   ├── log v0.4.20 (*)
│   ├── memchr v2.6.4
│   ├── once_cell v1.18.0
│   ├── pin-project-lite v0.2.13
│   ├── pin-utils v0.1.0
│   └── slab v0.4.9
├── attohttpc v0.26.1
│   ├── flate2 v1.0.28 (*)
│   ├── http v0.2.9 (*)
│   ├── log v0.4.20 (*)
│   ├── native-tls v0.2.11
│   │   ├── lazy_static v1.4.0
│   │   ├── libc v0.2.149
│   │   ├── security-framework v2.9.2
│   │   │   ├── bitflags v1.3.2
│   │   │   ├── core-foundation v0.9.3
│   │   │   │   ├── core-foundation-sys v0.8.4
│   │   │   │   └── libc v0.2.149
│   │   │   ├── core-foundation-sys v0.8.4
│   │   │   ├── libc v0.2.149
│   │   │   └── security-framework-sys v2.9.1
│   │   │       ├── core-foundation-sys v0.8.4
│   │   │       └── libc v0.2.149
│   │   ├── security-framework-sys v2.9.1 (*)
│   │   └── tempfile v3.8.1
│   │       ├── cfg-if v1.0.0
│   │       ├── fastrand v2.0.1
│   │       └── rustix v0.38.21
│   │           ├── bitflags v2.4.1
│   │           ├── errno v0.3.5 (*)
│   │           └── libc v0.2.149
│   ├── serde v1.0.190 (*)
│   ├── serde_json v1.0.108 (*)
│   ├── serde_urlencoded v0.7.1 (*)
│   └── url v2.4.1 (*)
├── base64 v0.21.5
├── cfonts v1.1.2
│   ├── enable-ansi-support v0.2.1
│   ├── exitcode v1.1.2
│   ├── rand v0.8.5 (*)
│   ├── serde v1.0.190 (*)
│   ├── serde_json v1.0.108 (*)
│   ├── strum v0.25.0
│   ├── strum_macros v0.25.3 (proc-macro)
│   │   ├── heck v0.4.1
│   │   ├── proc-macro2 v1.0.69 (*)
│   │   ├── quote v1.0.33 (*)
│   │   ├── rustversion v1.0.14 (proc-macro)
│   │   └── syn v2.0.38 (*)
│   ├── supports-color v2.1.0
│   │   ├── is-terminal v0.4.9
│   │   │   └── rustix v0.38.21 (*)
│   │   └── is_ci v1.1.1
│   └── terminal_size v0.2.6
│       └── rustix v0.37.27 (*)
├── dns-lookup v2.0.4
│   ├── cfg-if v1.0.0
│   ├── libc v0.2.149
│   └── socket2 v0.5.5 (*)
├── dotenv v0.15.0
├── futures v0.3.29
│   ├── futures-channel v0.3.29 (*)
│   ├── futures-core v0.3.29
│   ├── futures-executor v0.3.29
│   │   ├── futures-core v0.3.29
│   │   ├── futures-task v0.3.29
│   │   └── futures-util v0.3.29 (*)
│   ├── futures-io v0.3.29
│   ├── futures-sink v0.3.29
│   ├── futures-task v0.3.29
│   └── futures-util v0.3.29 (*)
├── headless_chrome v1.0.7 (https://github.com/atroche/rust-headless-chrome#66b3f9d6)
│   ├── anyhow v1.0.75
│   ├── base64 v0.21.5
│   ├── derive_builder v0.12.0
│   │   └── derive_builder_macro v0.12.0 (proc-macro)
│   │       ├── derive_builder_core v0.12.0
│   │       │   ├── darling v0.14.4
│   │       │   │   ├── darling_core v0.14.4
│   │       │   │   │   ├── fnv v1.0.7
│   │       │   │   │   ├── ident_case v1.0.1
│   │       │   │   │   ├── proc-macro2 v1.0.69 (*)
│   │       │   │   │   ├── quote v1.0.33 (*)
│   │       │   │   │   ├── strsim v0.10.0
│   │       │   │   │   └── syn v1.0.109 (*)
│   │       │   │   └── darling_macro v0.14.4 (proc-macro)
│   │       │   │       ├── darling_core v0.14.4 (*)
│   │       │   │       ├── quote v1.0.33 (*)
│   │       │   │       └── syn v1.0.109 (*)
│   │       │   ├── proc-macro2 v1.0.69 (*)
│   │       │   ├── quote v1.0.33 (*)
│   │       │   └── syn v1.0.109 (*)
│   │       └── syn v1.0.109 (*)
│   ├── directories v5.0.1
│   │   └── dirs-sys v0.4.1
│   │       ├── libc v0.2.149
│   │       └── option-ext v0.2.0
│   ├── log v0.4.20 (*)
│   ├── rand v0.8.5 (*)
│   ├── regex v1.10.2 (*)
│   ├── serde v1.0.190 (*)
│   ├── serde_json v1.0.108 (*)
│   ├── tempfile v3.8.1 (*)
│   ├── thiserror v1.0.50
│   │   └── thiserror-impl v1.0.50 (proc-macro)
│   │       ├── proc-macro2 v1.0.69 (*)
│   │       ├── quote v1.0.33 (*)
│   │       └── syn v2.0.38 (*)
│   ├── tungstenite v0.20.1
│   │   ├── byteorder v1.5.0
│   │   ├── bytes v1.5.0
│   │   ├── data-encoding v2.4.0
│   │   ├── http v0.2.9 (*)
│   │   ├── httparse v1.8.0
│   │   ├── log v0.4.20 (*)
│   │   ├── rand v0.8.5 (*)
│   │   ├── sha1 v0.10.6 (*)
│   │   ├── thiserror v1.0.50 (*)
│   │   ├── url v2.4.1 (*)
│   │   └── utf-8 v0.7.6
│   ├── ureq v2.8.0
│   │   ├── base64 v0.21.5
│   │   ├── flate2 v1.0.28 (*)
│   │   ├── log v0.4.20 (*)
│   │   ├── once_cell v1.18.0
│   │   ├── rustls v0.21.8
│   │   │   ├── log v0.4.20 (*)
│   │   │   ├── ring v0.17.5
│   │   │   │   ├── getrandom v0.2.10 (*)
│   │   │   │   └── untrusted v0.9.0
│   │   │   ├── rustls-webpki v0.101.7
│   │   │   │   ├── ring v0.17.5 (*)
│   │   │   │   └── untrusted v0.9.0
│   │   │   └── sct v0.7.1
│   │   │       ├── ring v0.17.5 (*)
│   │   │       └── untrusted v0.9.0
│   │   ├── rustls-webpki v0.101.7 (*)
│   │   ├── url v2.4.1 (*)
│   │   └── webpki-roots v0.25.2
│   ├── url v2.4.1 (*)
│   ├── walkdir v2.4.0
│   │   └── same-file v1.0.6
│   ├── which v4.4.2
│   │   ├── either v1.9.0
│   │   │   └── serde v1.0.190 (*)
│   │   ├── home v0.5.5
│   │   └── rustix v0.38.21 (*)
│   └── zip v0.6.6
│       ├── aes v0.8.3
│       │   ├── cfg-if v1.0.0
│       │   ├── cipher v0.4.4
│       │   │   ├── crypto-common v0.1.6 (*)
│       │   │   └── inout v0.1.3
│       │   │       └── generic-array v0.14.7 (*)
│       │   └── cpufeatures v0.2.11 (*)
│       ├── byteorder v1.5.0
│       ├── bzip2 v0.4.4
│       │   ├── bzip2-sys v0.1.11+1.0.8
│       │   │   └── libc v0.2.149
│       │   └── libc v0.2.149
│       ├── constant_time_eq v0.1.5
│       ├── crc32fast v1.3.2 (*)
│       ├── flate2 v1.0.28 (*)
│       ├── hmac v0.12.1
│       │   └── digest v0.10.7 (*)
│       ├── pbkdf2 v0.11.0
│       │   ├── digest v0.10.7 (*)
│       │   ├── hmac v0.12.1 (*)
│       │   ├── password-hash v0.4.2
│       │   │   ├── base64ct v1.6.0
│       │   │   ├── rand_core v0.6.4 (*)
│       │   │   └── subtle v2.5.0
│       │   └── sha2 v0.10.8
│       │       ├── cfg-if v1.0.0
│       │       ├── cpufeatures v0.2.11 (*)
│       │       └── digest v0.10.7 (*)
│       ├── sha1 v0.10.6 (*)
│       ├── time v0.3.30 (*)
│       └── zstd v0.11.2+zstd.1.5.2
│           └── zstd-safe v5.0.2+zstd.1.5.2
│               ├── libc v0.2.149
│               └── zstd-sys v2.0.9+zstd.1.5.5
├── isocountry v0.3.2
│   ├── serde v1.0.190 (*)
│   └── thiserror v1.0.50 (*)
├── jsonwebtoken v9.1.0
│   ├── base64 v0.21.5
│   ├── pem v3.0.2
│   │   └── base64 v0.21.5
│   ├── ring v0.17.5 (*)
│   ├── serde v1.0.190 (*)
│   ├── serde_json v1.0.108 (*)
│   └── simple_asn1 v0.6.2
│       ├── num-bigint v0.4.4
│       │   ├── num-integer v0.1.45
│       │   │   └── num-traits v0.2.17
│       │   └── num-traits v0.2.17
│       ├── num-traits v0.2.17
│       ├── thiserror v1.0.50 (*)
│       └── time v0.3.30 (*)
├── lazy_static v1.4.0
├── log v0.4.20 (*)
├── mac_address v1.1.5
│   └── nix v0.23.2
│       ├── bitflags v1.3.2
│       ├── cfg-if v1.0.0
│       ├── libc v0.2.149
│       └── memoffset v0.6.5
├── paho-mqtt v0.12.3
│   ├── async-channel v1.9.0 (*)
│   ├── crossbeam-channel v0.5.8
│   │   ├── cfg-if v1.0.0
│   │   └── crossbeam-utils v0.8.16 (*)
│   ├── futures v0.3.29 (*)
│   ├── futures-timer v3.0.2
│   ├── libc v0.2.149
│   ├── log v0.4.20 (*)
│   ├── paho-mqtt-sys v0.9.0
│   │   └── openssl-sys v0.9.93
│   │       └── libc v0.2.149
│   └── thiserror v1.0.50 (*)
├── r2d2 v0.8.10
│   ├── log v0.4.20 (*)
│   ├── parking_lot v0.12.1 (*)
│   └── scheduled-thread-pool v0.2.7
│       └── parking_lot v0.12.1 (*)
├── rand v0.8.5 (*)
├── redis v0.23.3
│   ├── combine v4.6.6
│   │   ├── bytes v1.5.0
│   │   └── memchr v2.6.4
│   ├── itoa v1.0.9
│   ├── percent-encoding v2.3.0
│   ├── r2d2 v0.8.10 (*)
│   ├── ryu v1.0.15
│   ├── sha1_smol v1.0.0
│   ├── socket2 v0.4.10 (*)
│   └── url v2.4.1 (*)
├── regex v1.10.2 (*)
├── serde v1.0.190 (*)
├── serde_json v1.0.108 (*)
├── simple_logger v4.2.0
│   ├── colored v2.0.4
│   │   ├── is-terminal v0.4.9 (*)
│   │   └── lazy_static v1.4.0
│   ├── log v0.4.20 (*)
│   └── time v0.3.30 (*)
├── utoipa v3.5.0
│   ├── indexmap v2.0.2 (*)
│   ├── serde v1.0.190 (*)
│   ├── serde_json v1.0.108 (*)
│   └── utoipa-gen v3.5.0 (proc-macro)
│       ├── proc-macro-error v1.0.4 (*)
│       ├── proc-macro2 v1.0.69 (*)
│       ├── quote v1.0.33 (*)
│       ├── regex v1.10.2 (*)
│       └── syn v2.0.38 (*)
├── utoipa-swagger-ui v3.1.5
│   ├── actix-web v4.4.0 (*)
│   ├── mime_guess v2.0.4
│   │   ├── mime v0.3.17
│   │   └── unicase v2.7.0
│   ├── rust-embed v6.8.1
│   │   ├── rust-embed-impl v6.8.1 (proc-macro)
│   │   │   ├── proc-macro2 v1.0.69 (*)
│   │   │   ├── quote v1.0.33 (*)
│   │   │   ├── rust-embed-utils v7.8.1
│   │   │   │   ├── sha2 v0.10.8 (*)
│   │   │   │   └── walkdir v2.4.0 (*)
│   │   │   ├── shellexpand v2.1.2
│   │   │   │   └── dirs v4.0.0
│   │   │   │       └── dirs-sys v0.3.7
│   │   │   │           └── libc v0.2.149
│   │   │   ├── syn v2.0.38 (*)
│   │   │   └── walkdir v2.4.0 (*)
│   │   ├── rust-embed-utils v7.8.1 (*)
│   │   └── walkdir v2.4.0 (*)
│   ├── serde v1.0.190 (*)
│   ├── serde_json v1.0.108 (*)
│   └── utoipa v3.5.0 (*)
    └── validators v0.24.4
        ├── idna v0.4.0 (*)
        ├── validators-derive v0.24.4 (proc-macro)
        │   ├── educe v0.4.23 (proc-macro)
        │   │   ├── enum-ordinalize v3.1.15 (proc-macro)
        │   │   │   ├── num-bigint v0.4.4 (*)
        │   │   │   ├── num-traits v0.2.17
        │   │   │   ├── proc-macro2 v1.0.69 (*)
        │   │   │   ├── quote v1.0.33 (*)
        │   │   │   └── syn v2.0.38 (*)
        │   │   ├── proc-macro2 v1.0.69 (*)
        │   │   ├── quote v1.0.33 (*)
        │   │   └── syn v1.0.109 (*)
        │   ├── enum-ordinalize v3.1.15 (proc-macro) (*)
        │   ├── proc-macro2 v1.0.69 (*)
        │   ├── quote v1.0.33 (*)
        │   ├── syn v1.0.109 (*)
        │   └── validators-options v0.24.4
        │       ├── educe v0.4.23 (proc-macro) (*)
        │       └── enum-ordinalize v3.1.15 (proc-macro) (*)
        └── validators-options v0.24.4 (*)

I actually had to cut out a bunch of the cargo tree output because it was putting me over Discourse's 32,000 character limit.

We can also use cargo vendor to copy the source code for all dependencies into the ./vendor/ directory and count the lines of code being compiled.

$ cargo vendor
  Downloaded windows-core v0.51.1
  ...
$ $ tokei vendor
===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 Assembly               16        36243        31826           50         4367
 GNU Style Assembly     79       119554       106059         1802        11693
 Autoconf                5         7468          952         4843         1673
 BASH                    7          227          143           58           26
 Batch                   2           26           13            4            9
 C                     143       619853       419215       155825        44813
 C Header              128        79974        38494        37426         4054
 CMake                  10         2962         2357          121          484
 C++                     1           67           47            4           16
 C++ Header              2          462          326           61           75
 CSS                    14         6283         5081          176         1026
 Dockerfile              7           88           56           12           20
 F*                      2          830          830            0            0
 JavaScript            280         9333         8141          482          710
 JSON                   31        67919        67919            0            0
 Makefile                6          766          594           49          123
 Module-Definition       1           27           27            0            0
 Pan                     2           36           24            4            8
 Perl                   34        40081        32588         3895         3598
 PowerShell              1           22           16            2            4
 Python                 29        10463         8563          489         1411
 R                       1           23           20            0            3
 RPM Specfile            1           78           58            0           20
 ReStructuredText        1          168           96            0           72
 Shell                  66         2281         1531          425          325
 SQL                    49          538          407           74           57
 SVG                    18         2342         2332            5            5
 Plain Text            120       423908            0       416215         7693
 TOML                  530        44433        34119         5109         5205
 XSL                     3          338          283           27           28
 XML                     3         3293         2941           20          332
 YAML                    8          738          620           33           85
-------------------------------------------------------------------------------
 HTML                  488        67659        63490         1362         2807
 |- CSS                  3          145          121            6           18
 |- JavaScript         471         5380         3510         1867            3
 (Total)                          73184        67121         3235         2828
-------------------------------------------------------------------------------
 Markdown              978        95736            0        67172        28564
 |- BASH                13           48           43            1            4
 |- C                    1            2            2            0            0
 |- GraphQL              1           30           30            0            0
 |- HTML                 3            4            4            0            0
 |- INI                  1            2            2            0            0
 |- JavaScript           1            3            2            0            1
 |- JSON                 9          204          204            0            0
 |- Rust               409        13535        10936          955         1644
 |- Shell                5           66           57            0            9
 |- TOML               167          639          566           55           18
 |- YAML                 1           52           38            4           10
 (Total)                         110321        11884        68187        30250
-------------------------------------------------------------------------------
 Rust                12116      4699170      4330831       115643       252696
 |- Markdown          5339       443058        18262       335385        89411
 (Total)                        5142228      4349093       451028       342107
===============================================================================
 Total               15182      6343389      5159999       811388       372002
===============================================================================

I'd say 7-8 minutes is pretty good when you are compiling 4.3 million lines of Rust and 419k lines of C.

6 Likes

And is it normal that the compilation time takes a lot of HW resources?

And is there a way to reduce them? Except of looking which I don't need.

$ tokei vendor
===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 Assembly               33        73173        64342           87         8744
 GNU Style Assembly    153       231441       206979         2703        21759
 Autoconf                5         7468          952         4843         1673
 BASH                    7          227          143           58           26
 Batch                   2           26           13            4            9
 C                     160       625776       423434       156857        45485
 C Header              144        91104        48017        38841         4246
 CMake                  10         2950         2347          121          482
 C++                     1           67           47            4           16
 C++ Header              5        10382        10088          147          147
 CSS                    14         6259         4973          284         1002
 Dockerfile             35          410          336           23           51
 F*                      2          589          589            0            0
 JavaScript            279         9293         8116          467          710
 JSON                   33        67054        67054            0            0
 Makefile                6          766          594           49          123
 Module-Definition       1           27           27            0            0
 Pan                     2           36           24            4            8
 Perl                   68        79082        64022         7935         7125
 PowerShell              1           22           16            2            4
 Python                 33        11153         9034          589         1530
 R                       1           23           20            0            3
 RPM Specfile            1           78           58            0           20
 ReStructuredText        1          168           96            0           72
 Shell                  73         2428         1665          414          349
 SQL                    49          538          407           74           57
 SVG                     9         1949         1945            2            2
 Plain Text            188       476438            0       464145        12293
 TOML                  530        44026        33894         5075         5057
 XSL                     3          338          283           27           28
 XML                     3         3293         2941           20          332
 YAML                    8          738          620           33           85
-------------------------------------------------------------------------------
 HTML                  486        68704        64543         1356         2805
 |- CSS                  3          145          121            6           18
 |- JavaScript         469         4976         3114         1859            3
 (Total)                          73825        67778         3221         2826
-------------------------------------------------------------------------------
 Markdown              972        93784            0        65756        28028
 |- BASH                14           64           59            1            4
 |- C                    1            2            2            0            0
 |- GraphQL              1           30           30            0            0
 |- HTML                 3            4            4            0            0
 |- INI                  1            2            2            0            0
 |- JavaScript           1            3            2            0            1
 |- JSON                 9          204          204            0            0
 |- Rust               407        13492        10918          942         1632
 |- Shell                5           66           57            0            9
 |- TOML               166          632          566           49           17
 |- YAML                 1           52           38            4           10
 (Total)                         108335        11882        66752        29701
-------------------------------------------------------------------------------
 Rust                13285      7385951      7023677       112934       249340
 |- Markdown          5352       427949        18186       324152        85611
 (Total)                        7813900      7041863       437086       334951
===============================================================================
 Total               16603      9295761      8041296       862854       391611
===============================================================================

Yes, especially optimizations (which are enabled when you use --release) are very resource demanding.

If two crates depend on compatible versions of another crate then cargo already shares that dependency between them.

What you could do though is to check whether you have multiple incompatible versions of the same dependency, or if you have multiple dependencies that do the same thing. For example:

  • you depend on async-std, which is an async runtime, but actix-web transitively depends on tokio, another async runtime. You could just depend on tokio, hopefully removing the async-std dependency and all its transitive dependencies.
  • lazy_static is often being replaced with once_cell, and if you're using Rust 1.70 or later you can even use OnceLock from the standard library, dropping a dependency altogether
  • attohttpc is an http client, but you already have ureq, another http client, in your dependency graph through headless_chrome.
7 Likes

Yes compiling uses all the cpu resources it can. You can specify the cargo build --jobs N flag to select how many N jobs you want to run and set N to something lower than your number of cores if you want to do other stuff than compiling in parallel with your computer.

3 Likes

Thanks everyone. Every answer helped.

1 Like

People frequently recommend to "go ahead and compile Linux kernel" as the ultimate test if your hardware is working well. All CPU cores and RAM is utilized, so yes, compiling is one of the most demanding tasks for HW.

Another observation - I've created a Github Action that runs some tests and checks for coverage of some code, that has relatively low number of dependencies, but it takes ~6 minutes to run (get up, do "cargo test"). So your 460 seconds compile is perfectly normal. Thx Rust developers they've improved this over time, now you get pretty fast compiles once dependencies are taken care of, few years ago even showing syntax errors in IDE was pretty laggy experience.

1 Like

This topic was automatically closed 90 days after the last reply. We invite you to open a new topic if you have further questions or comments.