mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-12 21:28:51 +00:00
Avoid monomorphization
This commit is contained in:
parent
e65d48d1fb
commit
fc3e591bdb
1 changed files with 35 additions and 0 deletions
|
@ -231,6 +231,41 @@ if words.len() != 2 {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# Avoid Monomorphization
|
||||||
|
|
||||||
|
Rust uses monomorphization to compile generic code, meaning that for each instantiation of a generic functions with concrete types, the function is compiled afresh, *per crate*.
|
||||||
|
This allows for exceptionally good performance, but leads to increased compile times.
|
||||||
|
Runtime performance obeys 80%/20% rule -- only a small fraction of code is hot.
|
||||||
|
Compile time **does not** obey this rule -- all code has to be compiled.
|
||||||
|
For this reason, avoid making a lot of code type parametric, *especially* on the boundaries between crates.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// Good
|
||||||
|
fn frbonicate(f: impl FnMut()) {
|
||||||
|
frobnicate_impl(&mut f)
|
||||||
|
}
|
||||||
|
fn frobnicate_impl(f: &mut dyn FnMut()) {
|
||||||
|
// lots of code
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not as good
|
||||||
|
fn frbonicate(f: impl FnMut()) {
|
||||||
|
// lots of code
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Avoid `AsRef` polymorphism, it pays back only for widely used libraries:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
// Good
|
||||||
|
fn frbonicate(f: &Path) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not as good
|
||||||
|
fn frbonicate(f: impl AsRef<Path>) {
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
# Documentation
|
# Documentation
|
||||||
|
|
||||||
For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines.
|
For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines.
|
||||||
|
|
Loading…
Reference in a new issue