@@ -37,6 +37,8 @@ use syntax::source_map::DUMMY_SP;
3737pub 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
4244pub ( 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!( "\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+ }
765868 }
766869
767870 #[ allow( nonstandard_style) ]
@@ -950,7 +1053,7 @@ macro_rules! define_queries_inner {
9501053macro_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.
0 commit comments