Percentage of allocs less than 32 bytes: 76.8

All allocations
# A tibble: 22 x 4
   obj_len     n n_less_than percent
     <int> <int>       <int>   <dbl>
 1       9  8095        8095    4.14
 2      10  1002        9097    4.65
 3      12   538        9635    4.93
 4      13     1        9636    4.93
 5      14 52107       61743   31.6 
 6      15  1465       63208   32.3 
 7      16 11378       74586   38.2 
 8      17  3182       77768   39.8 
 9      18   514       78282   40.1 
10      19   866       79148   40.5 
11      20   487       79635   40.7 
12      21  1894       81529   41.7 
13      22   356       81885   41.9 
14      23   217       82102   42.0 
15      24 57728      139830   71.5 
16      25   236      140066   71.7 
17      26   135      140201   71.7 
18      27   110      140311   71.8 
19      28   298      140609   71.9 
20      29   340      140949   72.1 
21      30    77      141026   72.2 
22      31   106      141132   72.2 
# A tibble: 5 x 4
  obj_len     n n_less_than percent
    <int> <int>       <int>   <dbl>
1    1032     7      195425    100.
2    2056     1      195426    100.
3    4104     3      195429    100.
4    4109     2      195431    100.
5    8200     1      195432    100 

Common Sizes
# A tibble: 8 x 2
  obj_len     n
    <int> <int>
1      24 57728
2      14 52107
3      40 32626
4      16 11378
5      32  8931
6       9  8095
7      72  6972
8      17  3182

    195,432 total allocations, total bytes = 5,417,329

Typed allocations
# A tibble: 20 x 3
   func_name                                                           n percent
   <chr>                                                           <int>   <dbl>
 1 List<Str*>* Alloc<List<Str*>>()                                 10080   11.2 
 2 runtime_asdl::part_value__String* Alloc<runtime_asdl::part_val~  6531    7.25
 3 List<runtime_asdl::part_value_t*>* Alloc<List<runtime_asdl::pa~  5543    6.15
 4 syntax_asdl::loc__Missing* Alloc<syntax_asdl::loc__Missing>()    3695    4.10
 5 Tuple2<runtime_asdl::span_e, int>* Alloc<Tuple2<runtime_asdl::~  3561    3.95
 6 List<process::Process*>* Alloc<List<process::Process*>>()        2971    3.30
 7 List<process::_RedirFrame*>* Alloc<List<process::_RedirFrame*>~  2971    3.30
 8 process::_FdFrame* Alloc<process::_FdFrame>()                    2971    3.30
 9 List<runtime_asdl::redirect*>* Alloc<List<runtime_asdl::redire~  2970    3.30
10 executor::_ProcessSubFrame* Alloc<executor::_ProcessSubFrame>()  2970    3.30
11 runtime_asdl::CommandStatus* Alloc<runtime_asdl::CommandStatus~  2970    3.30
12 runtime_asdl::StatusArray* Alloc<runtime_asdl::StatusArray, de~  2970    3.30
13 runtime_asdl::value__Bool* Alloc<runtime_asdl::value__Bool, bo~  2654    2.95
14 runtime_asdl::value__Str* Alloc<runtime_asdl::value__Str, Str*~  1860    2.06
15 List<Tuple3<Str*, bool, bool>*>* Alloc<List<Tuple3<Str*, bool,~  1855    2.06
16 syntax_asdl::loc__Word* Alloc<syntax_asdl::loc__Word, syntax_a~  1663    1.85
17 List<List<Tuple3<Str*, bool, bool>*>*>* Alloc<List<List<Tuple3~  1505    1.67
18 mylib::BufWriter* Alloc<mylib::BufWriter>()                      1444    1.60
19 runtime_asdl::value__Undef* Alloc<runtime_asdl::value__Undef>()  1438    1.60
20 Tuple3<Str*, bool, bool>* Alloc<Tuple3<Str*, bool, bool>, Str*~  1428    1.58
# A tibble: 5 x 3
  func_name                                                            n percent
  <chr>                                                            <int>   <dbl>
1 ui::ErrorFormatter* Alloc<ui::ErrorFormatter, alloc::Arena*&>(a~     1 0.00111
2 util::DebugFile* Alloc<util::DebugFile, mylib::Writer*>(mylib::~     1 0.00111
3 util::NullDebugFile* Alloc<util::NullDebugFile>()                    1 0.00111
4 word_eval::NormalWordEvaluator* Alloc<word_eval::NormalWordEval~     1 0.00111
5 word_eval::TildeEvaluator* Alloc<word_eval::TildeEvaluator, sta~     1 0.00111

90,105 typed allocs, including 36,413 List<T>
46.11% of allocs are typed

Str - NewStr() and OverAllocatedStr()
# A tibble: 16 x 4
   str_len     n n_less_than percent
     <int> <int>       <int>   <dbl>
 1       0   265         265   0.403
 2       1 52107       52372  79.6  
 3       2  1465       53837  81.8  
 4       3  1720       55557  84.4  
 5       4  3182       58739  89.3  
 6       5   514       59253  90.1  
 7       6   866       60119  91.4  
 8       7   486       60605  92.1  
 9       8  1894       62499  95.0  
10       9   356       62855  95.5  
11      10   217       63072  95.9  
12      11   161       63233  96.1  
13      12   236       63469  96.5  
14      13   135       63604  96.7  
15      14   110       63714  96.8  
16      15   298       64012  97.3  
# A tibble: 5 x 4
  str_len     n n_less_than percent
    <int> <int>       <int>   <dbl>
1     136     1       65785    100.
2     137     1       65786    100.
3     144     1       65787    100.
4     196     1       65788    100.
5    4096     2       65790    100 

65,790 string allocations, total length = 182,748, total bytes = 1,038,018

33.66% of allocs are strings
19.16% of bytes are strings

NewSlab()
  Lengths
# A tibble: 6 x 4
  slab_len     n n_less_than percent
     <int> <int>       <int>   <dbl>
1        2  4815        4815    12.1
2        3 22429       27244    68.4
3        6  4315       31559    79.3
4        7  3071       34630    87.0
5       14  2611       37241    93.6
6       15   881       38122    95.8
# A tibble: 5 x 4
  slab_len     n n_less_than percent
     <int> <int>       <int>   <dbl>
1      254     1       39797    100.
2      255     1       39798    100.
3      511     1       39799    100.
4     1022     2       39801    100.
5     1023     1       39802    100 

  Slab Types
# A tibble: 6 x 2
  func_name                                                                    n
  <chr>                                                                    <int>
1 Slab<Str*>* NewSlab<Str*>(int)                                           15066
2 Slab<runtime_asdl::part_value_t*>* NewSlab<runtime_asdl::part_value_t*>~  5996
3 Slab<int>* NewSlab<int>(int)                                              5273
4 Slab<runtime_asdl::value_t*>* NewSlab<runtime_asdl::value_t*>(int)        2418
5 Slab<Tuple3<Str*, bool, bool>*>* NewSlab<Tuple3<Str*, bool, bool>*>(int)  1855
6 Slab<List<Tuple3<Str*, bool, bool>*>*>* NewSlab<List<Tuple3<Str*, bool,~  1579
# A tibble: 5 x 2
  func_name                                                                    n
  <chr>                                                                    <int>
1 Slab<runtime_asdl::redirect*>* NewSlab<runtime_asdl::redirect*>(int)         1
2 Slab<split::IfsSplitter*>* NewSlab<split::IfsSplitter*>(int)                 1
3 Slab<syntax_asdl::if_arm*>* NewSlab<syntax_asdl::if_arm*>(int)               1
4 Slab<syntax_asdl::printf_part_t*>* NewSlab<syntax_asdl::printf_part_t*>~     1
5 Slab<void*>* NewSlab<void*>(int)                                             1

39,802 slabs, total items = 244,056
20.37% of allocs are slabs

::reserve(int n)

  Num Items
# A tibble: 15 x 4
   num_items     n n_less_than  percent
       <int> <int>       <int>    <dbl>
 1         0     1           1  0.00120
 2         1 26000       26001 31.2    
 3         2  8422       34423 41.4    
 4         3  6838       41261 49.6    
 5         4  4770       46031 55.3    
 6         5  3338       49369 59.3    
 7         6  3006       52375 62.9    
 8         7  3209       55584 66.8    
 9         8  2998       58582 70.4    
10         9  3051       61633 74.1    
11        10  2658       64291 77.2    
12        11  1692       65983 79.3    
13        12  1582       67565 81.2    
14        13  1485       69050 83.0    
15        14   860       69910 84.0    
# A tibble: 5 x 4
  num_items     n n_less_than percent
      <int> <int>       <int>   <dbl>
1       563     1       83225    100.
2       564     1       83226    100.
3       565     1       83227    100.
4       566     1       83228    100.
5      1022     2       83230    100 

83,230 reserve() calls, total items = 891,554

Untyped: 195,432
Typed + Str + Slab: 195,697