Skip to content

Commit 0257c5a

Browse files
committed
Add a command line flag to print some query stats
1 parent ddab10a commit 0257c5a

File tree

5 files changed

+112
-2
lines changed

5 files changed

+112
-2
lines changed

src/librustc/session/config.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
12911291
"emit Retagging MIR statements, interpreted e.g., by miri; implies -Zmir-opt-level=0"),
12921292
perf_stats: bool = (false, parse_bool, [UNTRACKED],
12931293
"print some performance-related statistics"),
1294+
query_stats: bool = (false, parse_bool, [UNTRACKED],
1295+
"print some statistics about the query system"),
12941296
hir_stats: bool = (false, parse_bool, [UNTRACKED],
12951297
"print some statistics about AST and HIR"),
12961298
always_encode_mir: bool = (false, parse_bool, [TRACKED],

src/librustc/ty/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,7 @@ pub struct GlobalCtxt<'tcx> {
913913
/// as well as all upstream crates. Only populated in incremental mode.
914914
pub def_path_hash_to_def_id: Option<FxHashMap<DefPathHash, DefId>>,
915915

916-
pub(crate) queries: query::Queries<'tcx>,
916+
pub queries: query::Queries<'tcx>,
917917

918918
// Records the free variables referenced by every closure
919919
// expression. Do not track deps for this, just recompute it from

src/librustc/ty/query/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ use rustc_target::spec::PanicStrategy;
6363
use std::borrow::Cow;
6464
use std::ops::Deref;
6565
use std::sync::Arc;
66+
use std::intrinsics::type_name;
6667
use syntax_pos::{Span, DUMMY_SP};
6768
use syntax_pos::symbol::InternedString;
6869
use syntax::attr;

src/librustc/ty/query/plumbing.rs

+104-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ use syntax::source_map::DUMMY_SP;
3737
pub struct QueryCache<'tcx, D: QueryConfig<'tcx> + ?Sized> {
3838
pub(super) results: FxHashMap<D::Key, QueryValue<D::Value>>,
3939
pub(super) active: FxHashMap<D::Key, QueryResult<'tcx>>,
40+
#[cfg(debug_assertions)]
41+
pub(super) cache_hits: usize,
4042
}
4143

4244
pub(super) struct QueryValue<T> {
@@ -60,6 +62,8 @@ impl<'tcx, M: QueryConfig<'tcx>> Default for QueryCache<'tcx, M> {
6062
QueryCache {
6163
results: FxHashMap::default(),
6264
active: FxHashMap::default(),
65+
#[cfg(debug_assertions)]
66+
cache_hits: 0,
6367
}
6468
}
6569
}
@@ -124,6 +128,10 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> {
124128
});
125129

126130
let result = Ok((value.value.clone(), value.index));
131+
#[cfg(debug_assertions)]
132+
{
133+
lock.cache_hits += 1;
134+
}
127135
return TryGetJob::JobCompleted(result);
128136
}
129137
let job = match lock.active.entry((*key).clone()) {
@@ -762,6 +770,101 @@ macro_rules! define_queries_inner {
762770

763771
jobs
764772
}
773+
774+
pub fn print_stats(&self) {
775+
let mut queries = Vec::new();
776+
777+
#[derive(Clone)]
778+
struct QueryStats {
779+
name: &'static str,
780+
cache_hits: usize,
781+
key_size: usize,
782+
key_type: &'static str,
783+
value_size: usize,
784+
value_type: &'static str,
785+
entry_count: usize,
786+
}
787+
788+
fn stats<'tcx, Q: QueryConfig<'tcx>>(
789+
name: &'static str,
790+
map: &QueryCache<'tcx, Q>
791+
) -> QueryStats {
792+
QueryStats {
793+
name,
794+
#[cfg(debug_assertions)]
795+
cache_hits: map.cache_hits,
796+
#[cfg(not(debug_assertions))]
797+
cache_hits: 0,
798+
key_size: mem::size_of::<Q::Key>(),
799+
key_type: unsafe { type_name::<Q::Key>() },
800+
value_size: mem::size_of::<Q::Value>(),
801+
value_type: unsafe { type_name::<Q::Value>() },
802+
entry_count: map.results.len(),
803+
}
804+
}
805+
806+
$(
807+
queries.push(stats::<queries::$name<'_>>(
808+
stringify!($name),
809+
&*self.$name.lock()
810+
));
811+
)*
812+
813+
if cfg!(debug_assertions) {
814+
let hits: usize = queries.iter().map(|s| s.cache_hits).sum();
815+
let results: usize = queries.iter().map(|s| s.entry_count).sum();
816+
println!("\nQuery cache hit rate: {}", hits as f64 / (hits + results) as f64);
817+
}
818+
819+
let mut query_key_sizes = queries.clone();
820+
query_key_sizes.sort_by_key(|q| q.key_size);
821+
println!("\nLarge query keys:");
822+
for q in query_key_sizes.iter().rev()
823+
.filter(|q| q.key_size > 8) {
824+
println!(
825+
" {} - {} x {} - {}",
826+
q.name,
827+
q.key_size,
828+
q.entry_count,
829+
q.key_type
830+
);
831+
}
832+
833+
let mut query_value_sizes = queries.clone();
834+
query_value_sizes.sort_by_key(|q| q.value_size);
835+
println!("\nLarge query values:");
836+
for q in query_value_sizes.iter().rev()
837+
.filter(|q| q.value_size > 8) {
838+
println!(
839+
" {} - {} x {} - {}",
840+
q.name,
841+
q.value_size,
842+
q.entry_count,
843+
q.value_type
844+
);
845+
}
846+
847+
if cfg!(debug_assertions) {
848+
let mut query_cache_hits = queries.clone();
849+
query_cache_hits.sort_by_key(|q| q.cache_hits);
850+
println!("\nQuery cache hits:");
851+
for q in query_cache_hits.iter().rev() {
852+
println!(
853+
" {} - {} ({}%)",
854+
q.name,
855+
q.cache_hits,
856+
q.cache_hits as f64 / (q.cache_hits + q.entry_count) as f64
857+
);
858+
}
859+
}
860+
861+
let mut query_value_count = queries.clone();
862+
query_value_count.sort_by_key(|q| q.entry_count);
863+
println!("\nQuery value count:");
864+
for q in query_value_count.iter().rev() {
865+
println!(" {} - {}", q.name, q.entry_count);
866+
}
867+
}
765868
}
766869

767870
#[allow(nonstandard_style)]
@@ -950,7 +1053,7 @@ macro_rules! define_queries_inner {
9501053
macro_rules! define_queries_struct {
9511054
(tcx: $tcx:tt,
9521055
input: ($(([$($modifiers:tt)*] [$($attr:tt)*] [$name:ident]))*)) => {
953-
pub(crate) struct Queries<$tcx> {
1056+
pub struct Queries<$tcx> {
9541057
/// This provides access to the incr. comp. on-disk cache for query results.
9551058
/// Do not access this directly. It is only meant to be used by
9561059
/// `DepGraph::try_mark_green()` and the query infrastructure.

src/librustc_driver/driver.rs

+4
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,10 @@ pub fn compile_input(
338338
}
339339
}
340340

341+
if tcx.sess.opts.debugging_opts.query_stats {
342+
tcx.queries.print_stats();
343+
}
344+
341345
Ok((outputs.clone(), ongoing_codegen, tcx.dep_graph.clone()))
342346
},
343347
)??

0 commit comments

Comments
 (0)