Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upGitHub is where the world builds software
Millions of developers and companies build, ship, and maintain their software on GitHub — the largest and most advanced development platform in the world.
Avoid many CrateConfig clones. #37161
Conversation
This commit changes `ExtCtx::cfg()` so it returns a `CrateConfig` reference instead of a clone. As a result, it also changes all of the `cfg()` callsites to explicitly clone... except one, because the commit also changes `macro_parser::parse()` to take `&CrateConfig`. This is good, because that function can be hot, and `CrateConfig` is expensive to clone. This change almost halves the number of heap allocations done by rustc for `html5ever` in rustc-benchmarks suite, which makes compilation 1.20x faster.
|
If we can't use references in some cases but the data is always immutable, why not wrap it in |
|
I tried making it a |
|
I mean, either |
I don't understand what you mean by this. Can you elaborate? Thanks. |
|
I mean that there's still many clones and some of them may contribute to expansion times in other crates. |
Premature optimization, don't let perfect be the enemy of good, etc, etc. Let's see what @nrc thinks. |
|
Hey I thought the motto of Rust was "Don't let 'good enough' be the enemy of 'perfect'" |
I know you are at least partly joking, but I will respond seriously: an uncompromising attitude like that makes sense for aspects of Rust's design as a language -- e.g. no compromise on memory safety -- but I don't think the same attitude is necessarily relevant or helpful when it comes to the compiler implementation. |
|
|
|
@nrc This PR adds clone calls all over the place, using |
Avoid many CrateConfig clones. This commit changes `ExtCtx::cfg()` so it returns a `CrateConfig` reference instead of a clone. As a result, it also changes all of the `cfg()` callsites to explicitly clone... except one, because the commit also changes `macro_parser::parse()` to take `&CrateConfig`. This is good, because that function can be hot, and `CrateConfig` is expensive to clone. This change almost halves the number of heap allocations done by rustc for `html5ever` in rustc-benchmarks suite, which makes compilation 1.20x faster. r? @nrc
Avoid many CrateConfig clones. This commit changes `ExtCtx::cfg()` so it returns a `CrateConfig` reference instead of a clone. As a result, it also changes all of the `cfg()` callsites to explicitly clone... except one, because the commit also changes `macro_parser::parse()` to take `&CrateConfig`. This is good, because that function can be hot, and `CrateConfig` is expensive to clone. This change almost halves the number of heap allocations done by rustc for `html5ever` in rustc-benchmarks suite, which makes compilation 1.20x faster. r? @nrc
Avoid many CrateConfig clones. This commit changes `ExtCtx::cfg()` so it returns a `CrateConfig` reference instead of a clone. As a result, it also changes all of the `cfg()` callsites to explicitly clone... except one, because the commit also changes `macro_parser::parse()` to take `&CrateConfig`. This is good, because that function can be hot, and `CrateConfig` is expensive to clone. This change almost halves the number of heap allocations done by rustc for `html5ever` in rustc-benchmarks suite, which makes compilation 1.20x faster. r? @nrc
@jseyfried ended up removing all the |
This commit changes
ExtCtx::cfg()so it returns aCrateConfigreference instead of a clone. As a result, it also changes all of the
cfg()callsites to explicitly clone... except one, because the commitalso changes
macro_parser::parse()to take&CrateConfig. This isgood, because that function can be hot, and
CrateConfigis expensiveto clone.
This change almost halves the number of heap allocations done by rustc
for
html5everin rustc-benchmarks suite, which makes compilation 1.20xfaster.
r? @nrc