diff options
| author | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2020-02-15 10:44:27 +0100 |
|---|---|---|
| committer | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2020-02-19 16:03:21 +0100 |
| commit | 52872ca1cbefd48c3639dcf7d3b32fa0d460a1df (patch) | |
| tree | 761e29e4ed18598cf55e5c05a15077aac22c7547 | |
| parent | d1a81c779dcc6022ff591f219a0d14e001a51f7d (diff) | |
| download | rust-52872ca1cbefd48c3639dcf7d3b32fa0d460a1df.tar.gz rust-52872ca1cbefd48c3639dcf7d3b32fa0d460a1df.zip | |
Add a stat for local DefId density
| -rw-r--r-- | src/librustc/ty/query/stats.rs | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/librustc/ty/query/stats.rs b/src/librustc/ty/query/stats.rs index 0c775e5f728..cecad5f2eeb 100644 --- a/src/librustc/ty/query/stats.rs +++ b/src/librustc/ty/query/stats.rs @@ -2,10 +2,27 @@ use crate::ty::query::config::QueryAccessors; use crate::ty::query::plumbing::QueryState; use crate::ty::query::queries; use crate::ty::TyCtxt; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use std::any::type_name; use std::mem; +trait KeyStats { + fn key_stats(&self, stats: &mut QueryStats); +} + +impl<T> KeyStats for T { + default fn key_stats(&self, _: &mut QueryStats) {} +} + +impl KeyStats for DefId { + fn key_stats(&self, stats: &mut QueryStats) { + if self.krate == LOCAL_CRATE { + stats.local_def_id_keys = Some(stats.local_def_id_keys.unwrap_or(0) + 1); + } + } +} + #[derive(Clone)] struct QueryStats { name: &'static str, @@ -15,13 +32,14 @@ struct QueryStats { value_size: usize, value_type: &'static str, entry_count: usize, + local_def_id_keys: Option<usize>, } fn stats<'tcx, Q: QueryAccessors<'tcx>>( name: &'static str, map: &QueryState<'tcx, Q>, ) -> QueryStats { - QueryStats { + let mut stats = QueryStats { name, #[cfg(debug_assertions)] cache_hits: map.cache_hits, @@ -32,7 +50,14 @@ fn stats<'tcx, Q: QueryAccessors<'tcx>>( value_size: mem::size_of::<Q::Value>(), value_type: type_name::<Q::Value>(), entry_count: map.iter_results(|results| results.count()), - } + local_def_id_keys: None, + }; + map.iter_results(|results| { + for (key, _, _) in results { + key.key_stats(&mut stats) + } + }); + stats } pub fn print_stats(tcx: TyCtxt<'_>) { @@ -78,6 +103,14 @@ pub fn print_stats(tcx: TyCtxt<'_>) { for q in query_value_count.iter().rev() { println!(" {} - {}", q.name, q.entry_count); } + + let mut def_id_density: Vec<_> = + queries.iter().filter(|q| q.local_def_id_keys.is_some()).collect(); + def_id_density.sort_by_key(|q| q.local_def_id_keys.unwrap()); + println!("\nLocal DefId density:"); + for q in def_id_density.iter().rev() { + println!(" {} - {}", q.name, q.local_def_id_keys.unwrap()); + } } macro_rules! print_stats { |
