@@ -37,6 +37,8 @@ use syntax::source_map::DUMMY_SP;
37
37
pub struct QueryCache < ' tcx , D : QueryConfig < ' tcx > + ?Sized > {
38
38
pub ( super ) results : FxHashMap < D :: Key , QueryValue < D :: Value > > ,
39
39
pub ( super ) active : FxHashMap < D :: Key , QueryResult < ' tcx > > ,
40
+ #[ cfg( debug_assertions) ]
41
+ pub ( super ) cache_hits : usize ,
40
42
}
41
43
42
44
pub ( super ) struct QueryValue < T > {
@@ -60,6 +62,8 @@ impl<'tcx, M: QueryConfig<'tcx>> Default for QueryCache<'tcx, M> {
60
62
QueryCache {
61
63
results : FxHashMap :: default ( ) ,
62
64
active : FxHashMap :: default ( ) ,
65
+ #[ cfg( debug_assertions) ]
66
+ cache_hits : 0 ,
63
67
}
64
68
}
65
69
}
@@ -124,6 +128,10 @@ impl<'a, 'tcx, Q: QueryDescription<'tcx>> JobOwner<'a, 'tcx, Q> {
124
128
} ) ;
125
129
126
130
let result = Ok ( ( value. value . clone ( ) , value. index ) ) ;
131
+ #[ cfg( debug_assertions) ]
132
+ {
133
+ lock. cache_hits += 1 ;
134
+ }
127
135
return TryGetJob :: JobCompleted ( result) ;
128
136
}
129
137
let job = match lock. active . entry ( ( * key) . clone ( ) ) {
@@ -762,6 +770,101 @@ macro_rules! define_queries_inner {
762
770
763
771
jobs
764
772
}
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!( "\n Query 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!( "\n Large 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!( "\n Large 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!( "\n Query 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!( "\n Query value count:" ) ;
864
+ for q in query_value_count. iter( ) . rev( ) {
865
+ println!( " {} - {}" , q. name, q. entry_count) ;
866
+ }
867
+ }
765
868
}
766
869
767
870
#[ allow( nonstandard_style) ]
@@ -950,7 +1053,7 @@ macro_rules! define_queries_inner {
950
1053
macro_rules! define_queries_struct {
951
1054
( tcx: $tcx: tt,
952
1055
input: ( $( ( [ $( $modifiers: tt) * ] [ $( $attr: tt) * ] [ $name: ident] ) ) * ) ) => {
953
- pub ( crate ) struct Queries <$tcx> {
1056
+ pub struct Queries <$tcx> {
954
1057
/// This provides access to the incr. comp. on-disk cache for query results.
955
1058
/// Do not access this directly. It is only meant to be used by
956
1059
/// `DepGraph::try_mark_green()` and the query infrastructure.
0 commit comments