@@ -27,6 +27,8 @@ use syntax::source_map::DUMMY_SP;
27
27
pub struct QueryCache < ' tcx , D : QueryConfig < ' tcx > + ?Sized > {
28
28
pub ( super ) results : FxHashMap < D :: Key , QueryValue < D :: Value > > ,
29
29
pub ( super ) active : FxHashMap < D :: Key , QueryResult < ' tcx > > ,
30
+ #[ cfg( debug_assertions) ]
31
+ pub ( super ) cache_hits : usize ,
30
32
}
31
33
32
34
pub ( super ) struct QueryValue < T > {
@@ -50,6 +52,8 @@ impl<'tcx, M: QueryConfig<'tcx>> Default for QueryCache<'tcx, M> {
50
52
QueryCache {
51
53
results : FxHashMap :: default ( ) ,
52
54
active : FxHashMap :: default ( ) ,
55
+ #[ cfg( debug_assertions) ]
56
+ cache_hits : 0 ,
53
57
}
54
58
}
55
59
}
@@ -114,6 +118,10 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> {
114
118
} ) ;
115
119
116
120
let result = Ok ( ( value. value . clone ( ) , value. index ) ) ;
121
+ #[ cfg( debug_assertions) ]
122
+ {
123
+ lock. cache_hits += 1 ;
124
+ }
117
125
return TryGetJob :: JobCompleted ( result) ;
118
126
}
119
127
let job = match lock. active . entry ( ( * key) . clone ( ) ) {
@@ -752,6 +760,101 @@ macro_rules! define_queries_inner {
752
760
753
761
jobs
754
762
}
763
+
764
+ pub fn print_stats( & self ) {
765
+ let mut queries = Vec :: new( ) ;
766
+
767
+ #[ derive( Clone ) ]
768
+ struct QueryStats {
769
+ name: & ' static str ,
770
+ cache_hits: usize ,
771
+ key_size: usize ,
772
+ key_type: & ' static str ,
773
+ value_size: usize ,
774
+ value_type: & ' static str ,
775
+ entry_count: usize ,
776
+ }
777
+
778
+ fn stats<' tcx, Q : QueryConfig <' tcx>>(
779
+ name: & ' static str ,
780
+ map: & QueryCache <' tcx, Q >
781
+ ) -> QueryStats {
782
+ QueryStats {
783
+ name,
784
+ #[ cfg( debug_assertions) ]
785
+ cache_hits: map. cache_hits,
786
+ #[ cfg( not( debug_assertions) ) ]
787
+ cache_hits: 0 ,
788
+ key_size: mem:: size_of:: <Q :: Key >( ) ,
789
+ key_type: unsafe { type_name:: <Q :: Key >( ) } ,
790
+ value_size: mem:: size_of:: <Q :: Value >( ) ,
791
+ value_type: unsafe { type_name:: <Q :: Value >( ) } ,
792
+ entry_count: map. results. len( ) ,
793
+ }
794
+ }
795
+
796
+ $(
797
+ queries. push( stats:: <queries:: $name<' _>>(
798
+ stringify!( $name) ,
799
+ & * self . $name. lock( )
800
+ ) ) ;
801
+ ) *
802
+
803
+ if cfg!( debug_assertions) {
804
+ let hits: usize = queries. iter( ) . map( |s| s. cache_hits) . sum( ) ;
805
+ let results: usize = queries. iter( ) . map( |s| s. entry_count) . sum( ) ;
806
+ println!( "\n Query cache hit rate: {}" , hits as f64 / ( hits + results) as f64 ) ;
807
+ }
808
+
809
+ let mut query_key_sizes = queries. clone( ) ;
810
+ query_key_sizes. sort_by_key( |q| q. key_size) ;
811
+ println!( "\n Large query keys:" ) ;
812
+ for q in query_key_sizes. iter( ) . rev( )
813
+ . filter( |q| q. key_size > 8 ) {
814
+ println!(
815
+ " {} - {} x {} - {}" ,
816
+ q. name,
817
+ q. key_size,
818
+ q. entry_count,
819
+ q. key_type
820
+ ) ;
821
+ }
822
+
823
+ let mut query_value_sizes = queries. clone( ) ;
824
+ query_value_sizes. sort_by_key( |q| q. value_size) ;
825
+ println!( "\n Large query values:" ) ;
826
+ for q in query_value_sizes. iter( ) . rev( )
827
+ . filter( |q| q. value_size > 8 ) {
828
+ println!(
829
+ " {} - {} x {} - {}" ,
830
+ q. name,
831
+ q. value_size,
832
+ q. entry_count,
833
+ q. value_type
834
+ ) ;
835
+ }
836
+
837
+ if cfg!( debug_assertions) {
838
+ let mut query_cache_hits = queries. clone( ) ;
839
+ query_cache_hits. sort_by_key( |q| q. cache_hits) ;
840
+ println!( "\n Query cache hits:" ) ;
841
+ for q in query_cache_hits. iter( ) . rev( ) {
842
+ println!(
843
+ " {} - {} ({}%)" ,
844
+ q. name,
845
+ q. cache_hits,
846
+ q. cache_hits as f64 / ( q. cache_hits + q. entry_count) as f64
847
+ ) ;
848
+ }
849
+ }
850
+
851
+ let mut query_value_count = queries. clone( ) ;
852
+ query_value_count. sort_by_key( |q| q. entry_count) ;
853
+ println!( "\n Query value count:" ) ;
854
+ for q in query_value_count. iter( ) . rev( ) {
855
+ println!( " {} - {}" , q. name, q. entry_count) ;
856
+ }
857
+ }
755
858
}
756
859
757
860
#[ allow( nonstandard_style) ]
@@ -940,7 +1043,7 @@ macro_rules! define_queries_inner {
940
1043
macro_rules! define_queries_struct {
941
1044
( tcx: $tcx: tt,
942
1045
input: ( $( ( [ $( $modifiers: tt) * ] [ $( $attr: tt) * ] [ $name: ident] ) ) * ) ) => {
943
- pub ( crate ) struct Queries <$tcx> {
1046
+ pub struct Queries <$tcx> {
944
1047
/// This provides access to the incr. comp. on-disk cache for query results.
945
1048
/// Do not access this directly. It is only meant to be used by
946
1049
/// `DepGraph::try_mark_green()` and the query infrastructure.
0 commit comments