Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Collect VTable stats & add -Zprint-vtable-sizes #112400

Merged
merged 5 commits into from
Jun 14, 2023

Conversation

WaffleLapkin
Copy link
Member

This is a bit hacky/buggy, but I'm not entirely sure how to fix it, so I want to ask reviewers for help...

To try this, use either of those:

  • cargo clean && RUSTFLAGS="-Zprint-vtable-sizes" cargo +toolchain b
  • cargo clean && cargo rustc +toolchain -Zprint-vtable-sizes
  • rustc +toolchain -Zprint-vtable-sizes ./file.rs

@rustbot
Copy link
Collaborator

rustbot commented Jun 7, 2023

r? @b-naber

(rustbot has picked a reviewer for you, use r? to override)

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jun 7, 2023
@WaffleLapkin
Copy link
Member Author

r? @compiler-errors

GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request Jun 8, 2023
…=Nilstrieb

Don't `use compile_error as print`

I've spent **1.5 hours** debugging this while trying to compile rust-lang#112400, if we use `compile_error!`, we should not just forward user input to it, but issue a reasonable error message.

The better solution would be to use a lint like `clippy::print_stdout`, but since we don't have clippy in CI, let's at least make the macro error better.

Also note that some functions called here actually do use `println` (see for example `print_type_sizes` function).
@WaffleLapkin
Copy link
Member Author

So, status update:

  • I've fixed both problematic examples I noted above
  • I've also removed vtable_entries_no_resolve in favor of counting entries by hand, as suggested by @compiler-errors
  • I've added a skip of object-unsafe traits
  • I've also squashed all the fixes together

With this I think this is ready for review.

Some things we might want to fix:

  • I've made some things pub which maybe shouldn't be pub
  • Naming is somewhat off, for example size_words_without_upcasting is ehhh
  • There are no tests. There probably should be at least some tests.

Comment on lines 921 to 927
let existential_trait_ref = trait_ref.map_bound(|trait_ref| {
ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref)
});

// Lookup the shape of vtable for the trait.
let own_existential_entries =
tcx.own_existential_vtable_entries(existential_trait_ref.def_id());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
let existential_trait_ref = trait_ref.map_bound(|trait_ref| {
ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref)
});
// Lookup the shape of vtable for the trait.
let own_existential_entries =
tcx.own_existential_vtable_entries(existential_trait_ref.def_id());
// Lookup the shape of vtable for the trait.
let own_existential_entries =
tcx.own_existential_vtable_entries(trait_ref.def_id());

compiler/rustc_interface/src/passes.rs Outdated Show resolved Hide resolved
size_words_without_upcasting: unupcasted_cost,
size_words_with_upcasting: unupcasted_cost + upcast_cost,
difference_words: upcast_cost,
difference_percent: upcast_cost as f64 / unupcasted_cost as f64 * 100.,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why isnt this (size_words_without_upcasting + size_words_with_upcasting) / size_words_without_upcasting... not sure if i totally understand the math here, that could use some explanation i think 😅

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nvm, I think I get it. This creates a "how much % larger is the new vtable compared to the old table". could use doc tho

Comment on lines 929 to 938
let own_entries = own_existential_entries.iter().copied().map(|_def_id| {
// The original code here ignores the method if its predicates are impossible.
// We can't really do that as, for example, all not trivial bounds on generic
// parameters are impossible (since we don't know the parameters...),
// see the comment above.

1
});

unupcasted_cost += own_entries.sum::<usize>();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you uplift this comment and just use count 😅

@rust-log-analyzer

This comment has been minimized.

@WaffleLapkin
Copy link
Member Author

@compiler-errors I've simplified the code, added some more docs, renamed some variables to make sense and finally added a test. I think this should be ready

@compiler-errors
Copy link
Member

@bors r+

@bors
Copy link
Contributor

bors commented Jun 13, 2023

📌 Commit af4631a has been approved by compiler-errors

It is now in the queue for this repository.

@bors bors removed the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Jun 13, 2023
@bors bors added the S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. label Jun 13, 2023
@bors
Copy link
Contributor

bors commented Jun 14, 2023

⌛ Testing commit af4631a with merge 7b0eac4...

@bors
Copy link
Contributor

bors commented Jun 14, 2023

☀️ Test successful - checks-actions
Approved by: compiler-errors
Pushing 7b0eac4 to master...

@bors bors added the merged-by-bors This PR was explicitly merged by bors. label Jun 14, 2023
@bors bors merged commit 7b0eac4 into rust-lang:master Jun 14, 2023
@rustbot rustbot added this to the 1.72.0 milestone Jun 14, 2023
@rust-timer
Copy link
Collaborator

Finished benchmarking commit (7b0eac4): comparison URL.

Overall result: ❌✅ regressions and improvements - no action needed

@rustbot label: -perf-regression

Instruction count

This is a highly reliable metric that was used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
0.9% [0.9%, 0.9%] 1
Improvements ✅
(primary)
-0.3% [-0.3%, -0.3%] 2
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) -0.3% [-0.3%, -0.3%] 2

Max RSS (memory usage)

Results

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
3.7% [3.7%, 3.7%] 1
Regressions ❌
(secondary)
- - 0
Improvements ✅
(primary)
-0.1% [-0.1%, -0.1%] 1
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) 1.8% [-0.1%, 3.7%] 2

Cycles

Results

This is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.

mean range count
Regressions ❌
(primary)
- - 0
Regressions ❌
(secondary)
5.4% [5.2%, 5.6%] 2
Improvements ✅
(primary)
- - 0
Improvements ✅
(secondary)
- - 0
All ❌✅ (primary) - - 0

Binary size

This benchmark run did not return any relevant results for this metric.

Bootstrap: 648.428s -> 648.095s (-0.05%)

@lqd
Copy link
Member

lqd commented Jun 14, 2023

I'm pretty sure the perf changes are noise 😅

@kornelski
Copy link
Contributor

Is this meant to display sizes for traits that are never used with dyn? I have a crate-private trait that is only ever used with a monomorphic implementation, but I still see print-vtable-sizes line for it.

@WaffleLapkin
Copy link
Member Author

@kornelski yes, this is expected. theoretically it'd be possible to filter out private & not used with dyn traits, but it's not trivial...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
merged-by-bors This PR was explicitly merged by bors. S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants