@@ -812,32 +812,38 @@ pub struct CtxtInterners<'tcx> {
812
812
813
813
impl < ' tcx > CtxtInterners < ' tcx > {
814
814
fn new ( arena : & ' tcx WorkerLocal < Arena < ' tcx > > ) -> CtxtInterners < ' tcx > {
815
+ // Default interner size - this value has been chosen empirically, and may need to be adjusted
816
+ // as the compiler evolves.
817
+ const N : usize = 2048 ;
815
818
CtxtInterners {
816
819
arena,
817
- type_ : Default :: default ( ) ,
818
- const_lists : Default :: default ( ) ,
819
- args : Default :: default ( ) ,
820
- type_lists : Default :: default ( ) ,
821
- region : Default :: default ( ) ,
822
- poly_existential_predicates : Default :: default ( ) ,
823
- canonical_var_infos : Default :: default ( ) ,
824
- predicate : Default :: default ( ) ,
825
- clauses : Default :: default ( ) ,
826
- projs : Default :: default ( ) ,
827
- place_elems : Default :: default ( ) ,
828
- const_ : Default :: default ( ) ,
829
- pat : Default :: default ( ) ,
830
- const_allocation : Default :: default ( ) ,
831
- bound_variable_kinds : Default :: default ( ) ,
832
- layout : Default :: default ( ) ,
833
- adt_def : Default :: default ( ) ,
834
- external_constraints : Default :: default ( ) ,
835
- predefined_opaques_in_body : Default :: default ( ) ,
836
- fields : Default :: default ( ) ,
837
- local_def_ids : Default :: default ( ) ,
838
- captures : Default :: default ( ) ,
839
- offset_of : Default :: default ( ) ,
840
- valtree : Default :: default ( ) ,
820
+ // The factors have been chosen by @FractalFir based on observed interner sizes
821
+ // (obtained by printing them using `x perf eprintln --includes cargo`),
822
+ // and then adjusted based on local perf runs.
823
+ type_ : InternedSet :: with_capacity ( N * 16 ) ,
824
+ const_lists : InternedSet :: with_capacity ( N * 4 ) ,
825
+ args : InternedSet :: with_capacity ( N * 4 ) ,
826
+ type_lists : InternedSet :: with_capacity ( N * 4 ) ,
827
+ region : InternedSet :: with_capacity ( N * 4 ) ,
828
+ poly_existential_predicates : InternedSet :: with_capacity ( N / 4 ) ,
829
+ canonical_var_infos : InternedSet :: with_capacity ( N / 2 ) ,
830
+ predicate : InternedSet :: with_capacity ( N ) ,
831
+ clauses : InternedSet :: with_capacity ( N ) ,
832
+ projs : InternedSet :: with_capacity ( N * 4 ) ,
833
+ place_elems : InternedSet :: with_capacity ( N * 2 ) ,
834
+ const_ : InternedSet :: with_capacity ( N * 2 ) ,
835
+ pat : InternedSet :: with_capacity ( N ) ,
836
+ const_allocation : InternedSet :: with_capacity ( N ) ,
837
+ bound_variable_kinds : InternedSet :: with_capacity ( N * 2 ) ,
838
+ layout : InternedSet :: with_capacity ( N ) ,
839
+ adt_def : InternedSet :: with_capacity ( N ) ,
840
+ external_constraints : InternedSet :: with_capacity ( N ) ,
841
+ predefined_opaques_in_body : InternedSet :: with_capacity ( N ) ,
842
+ fields : InternedSet :: with_capacity ( N * 4 ) ,
843
+ local_def_ids : InternedSet :: with_capacity ( N ) ,
844
+ captures : InternedSet :: with_capacity ( N ) ,
845
+ offset_of : InternedSet :: with_capacity ( N ) ,
846
+ valtree : InternedSet :: with_capacity ( N ) ,
841
847
}
842
848
}
843
849
@@ -2549,6 +2555,7 @@ macro_rules! slice_interners {
2549
2555
( $( $field: ident: $vis: vis $method: ident( $ty: ty) ) ,+ $( , ) ?) => (
2550
2556
impl <' tcx> TyCtxt <' tcx> {
2551
2557
$( $vis fn $method( self , v: & [ $ty] ) -> & ' tcx List <$ty> {
2558
+ //eprintln!("{} len:{}",stringify!($field), self.interners.$field.len());
2552
2559
if v. is_empty( ) {
2553
2560
List :: empty( )
2554
2561
} else {
@@ -2847,6 +2854,7 @@ impl<'tcx> TyCtxt<'tcx> {
2847
2854
// FIXME consider asking the input slice to be sorted to avoid
2848
2855
// re-interning permutations, in which case that would be asserted
2849
2856
// here.
2857
+
2850
2858
self . intern_local_def_ids ( clauses)
2851
2859
}
2852
2860
0 commit comments