Skip to content

Commit d1a81c7

Browse files
committed
Split query stats into its own file
1 parent 8a2ad75 commit d1a81c7

File tree

5 files changed

+108
-99
lines changed

5 files changed

+108
-99
lines changed

src/librustc/ty/query/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ use rustc_target::spec::PanicStrategy;
5252
use rustc_attr as attr;
5353
use rustc_span::symbol::Symbol;
5454
use rustc_span::{Span, DUMMY_SP};
55-
use std::any::type_name;
5655
use std::borrow::Cow;
5756
use std::convert::TryFrom;
5857
use std::ops::Deref;
@@ -64,6 +63,9 @@ mod plumbing;
6463
use self::plumbing::*;
6564
pub use self::plumbing::{force_from_dep_node, CycleError};
6665

66+
mod stats;
67+
pub use self::stats::print_stats;
68+
6769
mod job;
6870
#[cfg(parallel_compiler)]
6971
pub use self::job::handle_deadlock;

src/librustc/ty/query/plumbing.rs

Lines changed: 0 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -883,101 +883,6 @@ macro_rules! define_queries_inner {
883883

884884
Some(jobs)
885885
}
886-
887-
pub fn print_stats(&self) {
888-
let mut queries = Vec::new();
889-
890-
#[derive(Clone)]
891-
struct QueryStats {
892-
name: &'static str,
893-
cache_hits: usize,
894-
key_size: usize,
895-
key_type: &'static str,
896-
value_size: usize,
897-
value_type: &'static str,
898-
entry_count: usize,
899-
}
900-
901-
fn stats<'tcx, Q: QueryAccessors<'tcx>>(
902-
name: &'static str,
903-
map: &QueryState<'tcx, Q>,
904-
) -> QueryStats {
905-
QueryStats {
906-
name,
907-
#[cfg(debug_assertions)]
908-
cache_hits: map.cache_hits,
909-
#[cfg(not(debug_assertions))]
910-
cache_hits: 0,
911-
key_size: mem::size_of::<Q::Key>(),
912-
key_type: type_name::<Q::Key>(),
913-
value_size: mem::size_of::<Q::Value>(),
914-
value_type: type_name::<Q::Value>(),
915-
entry_count: map.iter_results(|results| results.count()),
916-
}
917-
}
918-
919-
$(
920-
queries.push(stats::<queries::$name<'_>>(
921-
stringify!($name),
922-
&self.$name,
923-
));
924-
)*
925-
926-
if cfg!(debug_assertions) {
927-
let hits: usize = queries.iter().map(|s| s.cache_hits).sum();
928-
let results: usize = queries.iter().map(|s| s.entry_count).sum();
929-
println!("\nQuery cache hit rate: {}", hits as f64 / (hits + results) as f64);
930-
}
931-
932-
let mut query_key_sizes = queries.clone();
933-
query_key_sizes.sort_by_key(|q| q.key_size);
934-
println!("\nLarge query keys:");
935-
for q in query_key_sizes.iter().rev()
936-
.filter(|q| q.key_size > 8) {
937-
println!(
938-
" {} - {} x {} - {}",
939-
q.name,
940-
q.key_size,
941-
q.entry_count,
942-
q.key_type
943-
);
944-
}
945-
946-
let mut query_value_sizes = queries.clone();
947-
query_value_sizes.sort_by_key(|q| q.value_size);
948-
println!("\nLarge query values:");
949-
for q in query_value_sizes.iter().rev()
950-
.filter(|q| q.value_size > 8) {
951-
println!(
952-
" {} - {} x {} - {}",
953-
q.name,
954-
q.value_size,
955-
q.entry_count,
956-
q.value_type
957-
);
958-
}
959-
960-
if cfg!(debug_assertions) {
961-
let mut query_cache_hits = queries.clone();
962-
query_cache_hits.sort_by_key(|q| q.cache_hits);
963-
println!("\nQuery cache hits:");
964-
for q in query_cache_hits.iter().rev() {
965-
println!(
966-
" {} - {} ({}%)",
967-
q.name,
968-
q.cache_hits,
969-
q.cache_hits as f64 / (q.cache_hits + q.entry_count) as f64
970-
);
971-
}
972-
}
973-
974-
let mut query_value_count = queries.clone();
975-
query_value_count.sort_by_key(|q| q.entry_count);
976-
println!("\nQuery value count:");
977-
for q in query_value_count.iter().rev() {
978-
println!(" {} - {}", q.name, q.entry_count);
979-
}
980-
}
981886
}
982887

983888
#[allow(nonstandard_style)]

src/librustc/ty/query/stats.rs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
use crate::ty::query::config::QueryAccessors;
2+
use crate::ty::query::plumbing::QueryState;
3+
use crate::ty::query::queries;
4+
use crate::ty::TyCtxt;
5+
6+
use std::any::type_name;
7+
use std::mem;
8+
9+
#[derive(Clone)]
10+
struct QueryStats {
11+
name: &'static str,
12+
cache_hits: usize,
13+
key_size: usize,
14+
key_type: &'static str,
15+
value_size: usize,
16+
value_type: &'static str,
17+
entry_count: usize,
18+
}
19+
20+
fn stats<'tcx, Q: QueryAccessors<'tcx>>(
21+
name: &'static str,
22+
map: &QueryState<'tcx, Q>,
23+
) -> QueryStats {
24+
QueryStats {
25+
name,
26+
#[cfg(debug_assertions)]
27+
cache_hits: map.cache_hits,
28+
#[cfg(not(debug_assertions))]
29+
cache_hits: 0,
30+
key_size: mem::size_of::<Q::Key>(),
31+
key_type: type_name::<Q::Key>(),
32+
value_size: mem::size_of::<Q::Value>(),
33+
value_type: type_name::<Q::Value>(),
34+
entry_count: map.iter_results(|results| results.count()),
35+
}
36+
}
37+
38+
pub fn print_stats(tcx: TyCtxt<'_>) {
39+
let queries = query_stats(tcx);
40+
41+
if cfg!(debug_assertions) {
42+
let hits: usize = queries.iter().map(|s| s.cache_hits).sum();
43+
let results: usize = queries.iter().map(|s| s.entry_count).sum();
44+
println!("\nQuery cache hit rate: {}", hits as f64 / (hits + results) as f64);
45+
}
46+
47+
let mut query_key_sizes = queries.clone();
48+
query_key_sizes.sort_by_key(|q| q.key_size);
49+
println!("\nLarge query keys:");
50+
for q in query_key_sizes.iter().rev().filter(|q| q.key_size > 8) {
51+
println!(" {} - {} x {} - {}", q.name, q.key_size, q.entry_count, q.key_type);
52+
}
53+
54+
let mut query_value_sizes = queries.clone();
55+
query_value_sizes.sort_by_key(|q| q.value_size);
56+
println!("\nLarge query values:");
57+
for q in query_value_sizes.iter().rev().filter(|q| q.value_size > 8) {
58+
println!(" {} - {} x {} - {}", q.name, q.value_size, q.entry_count, q.value_type);
59+
}
60+
61+
if cfg!(debug_assertions) {
62+
let mut query_cache_hits = queries.clone();
63+
query_cache_hits.sort_by_key(|q| q.cache_hits);
64+
println!("\nQuery cache hits:");
65+
for q in query_cache_hits.iter().rev() {
66+
println!(
67+
" {} - {} ({}%)",
68+
q.name,
69+
q.cache_hits,
70+
q.cache_hits as f64 / (q.cache_hits + q.entry_count) as f64
71+
);
72+
}
73+
}
74+
75+
let mut query_value_count = queries.clone();
76+
query_value_count.sort_by_key(|q| q.entry_count);
77+
println!("\nQuery value count:");
78+
for q in query_value_count.iter().rev() {
79+
println!(" {} - {}", q.name, q.entry_count);
80+
}
81+
}
82+
83+
macro_rules! print_stats {
84+
(<$tcx:tt> $($category:tt {
85+
$($(#[$attr:meta])* [$($modifiers:tt)*] fn $name:ident: $node:ident($K:ty) -> $V:ty,)*
86+
},)*) => {
87+
fn query_stats(tcx: TyCtxt<'_>) -> Vec<QueryStats> {
88+
let mut queries = Vec::new();
89+
90+
$($(
91+
queries.push(stats::<queries::$name<'_>>(
92+
stringify!($name),
93+
&tcx.queries.$name,
94+
));
95+
)*)*
96+
97+
queries
98+
}
99+
}
100+
}
101+
102+
rustc_query_append! { [print_stats!][<'tcx>] }

src/librustc_interface/passes.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,8 +696,8 @@ impl<'tcx> QueryContext<'tcx> {
696696
ty::tls::enter_global(self.0, |tcx| f(tcx))
697697
}
698698

699-
pub fn print_stats(&self) {
700-
self.0.queries.print_stats()
699+
pub fn print_stats(&mut self) {
700+
self.enter(|tcx| ty::query::print_stats(tcx))
701701
}
702702
}
703703

src/librustc_interface/queries.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ impl Compiler {
340340

341341
if self.session().opts.debugging_opts.query_stats {
342342
if let Ok(gcx) = queries.global_ctxt() {
343-
gcx.peek().print_stats();
343+
gcx.peek_mut().print_stats();
344344
}
345345
}
346346

0 commit comments

Comments
 (0)