fn main() {
make_menagerie();
}
async fn make_menagerie() -> Vec<String> {
vec![
"monster".to_string(), // <=== repeat this line 1000 to 10000 times.
]
}
Build with cargo build. I'm using Rust 1.72 on aarch64-apple-darwin.
In addition to the slow compilation time, I also see large memory usage. With 2500 lines, my OS reported rustc as consuming 20GB.
Exploration
Different versions
There was no obvious correlation.
| Version |
Time (sec) |
| 1.63 |
18.984 |
| 1.64 |
19.224 |
| 1.65 |
18.797 |
| 1.66 |
18.993 |
| 1.67 |
18.917 |
| 1.68 |
17.994 |
| 1.69 |
18.349 |
| 1.70 |
21.379 |
| 1.71 |
20.655 |
| 1.72 |
22.587 |
Different numbers of lines
This appears to show time is proportional to (number of lines)^2
| Lines |
Time |
| 500 |
0.133 |
| 1000 |
2.831 |
| 1500 |
6.512 |
| 2000 |
13.545 |
| 2500 |
22.404 |
| 3000 |
35.894 |
String slices
Switching to returning a &'static str instead of String resulted in fast compilation (<250 ms).
Using a function
Creating a helper function and calling it inside of vec![] resulted in fast compilation (<250 ms).
fn make_string() -> String { "monster".to_string() }
Using another method
Switching to returning a usize instead of a String has reduced compilation time but still surprisingly slow (2.5 sec).
Avoiding async fn
Removing async from make_menagerie has reduced compilation time (<750 ms)
Test case generation
For trying different things, I used two files
main.rs
fn main() {
make_menagerie();
}
async fn make_menagerie() -> Vec<String> {
include!("repeat.rs")
}
And to generate 2500 lines:
(echo 'vec!['; yes '"monster".to_string(),' | head -n 2500; echo ']') > src/repeat.rs
Build with
cargo build. I'm using Rust 1.72 on aarch64-apple-darwin.In addition to the slow compilation time, I also see large memory usage. With 2500 lines, my OS reported
rustcas consuming 20GB.Exploration
Different versions
There was no obvious correlation.
Different numbers of lines
This appears to show time is proportional to (number of lines)^2
String slices
Switching to returning a
&'static strinstead ofStringresulted in fast compilation (<250 ms).Using a function
Creating a helper function and calling it inside of
vec![]resulted in fast compilation (<250 ms).Using another method
Switching to returning a
usizeinstead of aStringhas reduced compilation time but still surprisingly slow (2.5 sec).Avoiding
async fnRemoving
asyncfrommake_menageriehas reduced compilation time (<750 ms)Test case generation
For trying different things, I used two files
main.rs
And to generate 2500 lines: