]> git.lizzy.rs Git - rust.git/commitdiff
Add a stat for local DefId density
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Sat, 15 Feb 2020 09:44:27 +0000 (10:44 +0100)
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Wed, 19 Feb 2020 15:03:21 +0000 (16:03 +0100)
src/librustc/ty/query/stats.rs

index 0c775e5f7284db3ed1bdf0eba68ddb6225dea9c0..cecad5f2eebd74cc8df61b95aa04098225e2fdc5 100644 (file)
@@ -2,10 +2,27 @@
 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 {