https://github.com/mordante created 
https://github.com/llvm/llvm-project/pull/101805

The formatter specializations for _CharT* and const _CharT* typically write all 
elements in a loop. This format's internal functions are optimized for larger 
writes.

Instead of writing one element at a time conversion the range to a 
basic_string_view and write that instead.

For C string of 6 characters this is a bit slower, but for 60 characters it's 
faster. The improvements for back_inserter<std::list<_CharT>> are not as great 
as the others; it just gets as slow as basic_string_view<_CharT>.

Before
---------------------------------------------------------------------------------------------------------------
Benchmark                                                                     
Time             CPU   Iterations
---------------------------------------------------------------------------------------------------------------
BM_sprintf/C string len = 6                                                4.81 
ns         4.80 ns    145890280
BM_format/C string len = 6                                                 52.6 
ns         52.4 ns     13252327
BM_format_to_back_inserter<std::string>/C string len = 6                   53.0 
ns         52.8 ns     13262680
BM_format_to_back_inserter<std::vector<char>>/C string len = 6             69.7 
ns         69.6 ns     10045636
BM_format_to_back_inserter<std::deque<char>>/C string len = 6               148 
ns          148 ns      4729368
BM_format_to_back_inserter<std::list<char>>/C string len = 6                127 
ns          126 ns      5538441
BM_format_to_iterator/<std::array> C string len = 6                        42.9 
ns         42.8 ns     16367158
BM_format_to_iterator/<std::string> C string len = 6                       43.5 
ns         43.4 ns     16141644
BM_format_to_iterator/<std::vector> C string len = 6                       42.9 
ns         42.8 ns     16366718
BM_format_to_iterator/<std::deque> C string len = 6                        47.8 
ns         47.7 ns     14686488
BM_format/string len = 6                                                   55.3 
ns         55.2 ns     12696889
BM_format_to_back_inserter<std::string>/string len = 6                     55.4 
ns         55.2 ns     12660731
BM_format_to_back_inserter<std::vector<char>>/string len = 6               70.7 
ns         70.5 ns      9927313
BM_format_to_back_inserter<std::deque<char>>/string len = 6                 153 
ns          153 ns      4573936
BM_format_to_back_inserter<std::list<char>>/string len = 6                  128 
ns          128 ns      5486033
BM_format_to_iterator/<std::array> string len = 6                          44.6 
ns         44.5 ns     15758122
BM_format_to_iterator/<std::string> string len = 6                         44.7 
ns         44.6 ns     15690226
BM_format_to_iterator/<std::vector> string len = 6                         44.3 
ns         44.2 ns     15715898
BM_format_to_iterator/<std::deque> string len = 6                          50.3 
ns         50.1 ns     13958635
BM_format/string_view len = 6                                              54.2 
ns         54.1 ns     12929525
BM_format_to_back_inserter<std::string>/string_view len = 6                54.3 
ns         54.1 ns     12929219
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6          70.0 
ns         69.8 ns     10022355
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6            153 
ns          152 ns      4585749
BM_format_to_back_inserter<std::list<char>>/string_view len = 6             128 
ns          128 ns      5489760
BM_format_to_iterator/<std::array> string_view len = 6                     44.2 
ns         44.1 ns     15884839
BM_format_to_iterator/<std::string> string_view len = 6                    44.8 
ns         44.6 ns     15664278
BM_format_to_iterator/<std::vector> string_view len = 6                    44.7 
ns         44.6 ns     15716983
BM_format_to_iterator/<std::deque> string_view len = 6                     50.3 
ns         50.2 ns     13936091
BM_sprintf/C string len = 60                                               4.16 
ns         4.15 ns    168764227
BM_format/C string len = 60                                                 169 
ns          169 ns      4144060
BM_format_to_back_inserter<std::string>/C string len = 60                   167 
ns          167 ns      4203915
BM_format_to_back_inserter<std::vector<char>>/C string len = 60             177 
ns          176 ns      3965619
BM_format_to_back_inserter<std::deque<char>>/C string len = 60              383 
ns          382 ns      1832531
BM_format_to_back_inserter<std::list<char>>/C string len = 60              1270 
ns         1267 ns       552686
BM_format_to_iterator/<std::array> C string len = 60                        141 
ns          140 ns      4988441
BM_format_to_iterator/<std::string> C string len = 60                       141 
ns          141 ns      4956101
BM_format_to_iterator/<std::vector> C string len = 60                       141 
ns          141 ns      4963443
BM_format_to_iterator/<std::deque> C string len = 60                        144 
ns          143 ns      4893139
BM_format/string len = 60                                                  73.4 
ns         73.2 ns      9548455
BM_format_to_back_inserter<std::string>/string len = 60                    73.2 
ns         73.0 ns      9524524
BM_format_to_back_inserter<std::vector<char>>/string len = 60              81.6 
ns         81.4 ns      8584033
BM_format_to_back_inserter<std::deque<char>>/string len = 60                279 
ns          279 ns      2515146
BM_format_to_back_inserter<std::list<char>>/string len = 60                1177 
ns         1174 ns       597172
BM_format_to_iterator/<std::array> string len = 60                         44.5 
ns         44.4 ns     15753131
BM_format_to_iterator/<std::string> string len = 60                        44.7 
ns         44.6 ns     15692630
BM_format_to_iterator/<std::vector> string len = 60                        44.8 
ns         44.7 ns     15664689
BM_format_to_iterator/<std::deque> string len = 60                         50.6 
ns         50.5 ns     13838617
BM_format/string_view len = 60                                             72.8 
ns         72.6 ns      9674007
BM_format_to_back_inserter<std::string>/string_view len = 60               72.7 
ns         72.6 ns      9638209
BM_format_to_back_inserter<std::vector<char>>/string_view len = 60         82.6 
ns         82.4 ns      8496602
BM_format_to_back_inserter<std::deque<char>>/string_view len = 60           280 
ns          280 ns      2508982
BM_format_to_back_inserter<std::list<char>>/string_view len = 60           1176 
ns         1173 ns       597714
BM_format_to_iterator/<std::array> string_view len = 60                    44.2 
ns         44.1 ns     15896934
BM_format_to_iterator/<std::string> string_view len = 60                   44.7 
ns         44.6 ns     15695427
BM_format_to_iterator/<std::vector> string_view len = 60                   44.7 
ns         44.6 ns     15680899
BM_format_to_iterator/<std::deque> string_view len = 60                    50.3 
ns         50.1 ns     13962755
BM_sprintf/C string len = 6000                                              114 
ns          114 ns      6170153
BM_format/C string len = 6000                                             11792 
ns        11763 ns        59619
BM_format_to_back_inserter<std::string>/C string len = 6000               11778 
ns        11746 ns        59572
BM_format_to_back_inserter<std::vector<char>>/C string len = 6000         11715 
ns        11686 ns        60053
BM_format_to_back_inserter<std::deque<char>>/C string len = 6000          25464 
ns        25403 ns        27538
BM_format_to_back_inserter<std::list<char>>/C string len = 6000          126044 
ns       125726 ns         5572
BM_format_to_iterator/<std::array> C string len = 6000                    10792 
ns        10766 ns        64943
BM_format_to_iterator/<std::string> C string len = 6000                   10791 
ns        10761 ns        64918
BM_format_to_iterator/<std::vector> C string len = 6000                   10775 
ns        10750 ns        65149
BM_format_to_iterator/<std::deque> C string len = 6000                    11242 
ns        11215 ns        62542
BM_format/string len = 6000                                                 919 
ns          917 ns       763961
BM_format_to_back_inserter<std::string>/string len = 6000                   920 
ns          917 ns       763094
BM_format_to_back_inserter<std::vector<char>>/string len = 6000             888 
ns          886 ns       793468
BM_format_to_back_inserter<std::deque<char>>/string len = 6000            14999 
ns        14963 ns        46758
BM_format_to_back_inserter<std::list<char>>/string len = 6000            114504 
ns       114213 ns         6130
BM_format_to_iterator/<std::array> string len = 6000                        120 
ns          120 ns      5823426
BM_format_to_iterator/<std::string> string len = 6000                       106 
ns          106 ns      6609299
BM_format_to_iterator/<std::vector> string len = 6000                       106 
ns          106 ns      6613867
BM_format_to_iterator/<std::deque> string len = 6000                        367 
ns          366 ns      1912818
BM_format/string_view len = 6000                                            910 
ns          907 ns       771491
BM_format_to_back_inserter<std::string>/string_view len = 6000              911 
ns          909 ns       770065
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6000        878 
ns          876 ns       794976
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6000       15031 
ns        14994 ns        46651
BM_format_to_back_inserter<std::list<char>>/string_view len = 6000       114510 
ns       114219 ns         6130
BM_format_to_iterator/<std::array> string_view len = 6000                   121 
ns          120 ns      5814249
BM_format_to_iterator/<std::string> string_view len = 6000                  116 
ns          115 ns      6072315
BM_format_to_iterator/<std::vector> string_view len = 6000                  115 
ns          115 ns      6095762
BM_format_to_iterator/<std::deque> string_view len = 6000                   351 
ns          350 ns      2002175

After
---------------------------------------------------------------------------------------------------------------
Benchmark                                                                     
Time             CPU   Iterations
---------------------------------------------------------------------------------------------------------------
BM_sprintf/C string len = 6                                                4.83 
ns         4.83 ns    145502957
BM_format/C string len = 6                                                 55.1 
ns         55.1 ns     12687656
BM_format_to_back_inserter<std::string>/C string len = 6                   55.1 
ns         55.1 ns     12691642
BM_format_to_back_inserter<std::vector<char>>/C string len = 6             71.2 
ns         71.3 ns      9819560
BM_format_to_back_inserter<std::deque<char>>/C string len = 6               154 
ns          154 ns      4548709
BM_format_to_back_inserter<std::list<char>>/C string len = 6                131 
ns          131 ns      5338318
BM_format_to_iterator/<std::array> C string len = 6                        45.0 
ns         45.0 ns     15569429
BM_format_to_iterator/<std::string> C string len = 6                       45.9 
ns         45.9 ns     15240594
BM_format_to_iterator/<std::vector> C string len = 6                       44.4 
ns         44.4 ns     15768343
BM_format_to_iterator/<std::deque> C string len = 6                        50.1 
ns         50.1 ns     13995837
BM_format/string len = 6                                                   54.8 
ns         54.8 ns     12738209
BM_format_to_back_inserter<std::string>/string len = 6                     55.4 
ns         55.4 ns     12634483
BM_format_to_back_inserter<std::vector<char>>/string len = 6               70.4 
ns         70.4 ns      9948288
BM_format_to_back_inserter<std::deque<char>>/string len = 6                 154 
ns          154 ns      4531741
BM_format_to_back_inserter<std::list<char>>/string len = 6                  132 
ns          132 ns      5289798
BM_format_to_iterator/<std::array> string len = 6                          44.5 
ns         44.5 ns     15743437
BM_format_to_iterator/<std::string> string len = 6                         44.9 
ns         44.9 ns     15591961
BM_format_to_iterator/<std::vector> string len = 6                         45.0 
ns         45.0 ns     15541308
BM_format_to_iterator/<std::deque> string len = 6                          50.5 
ns         50.5 ns     13837884
BM_format/string_view len = 6                                              54.5 
ns         54.5 ns     12833591
BM_format_to_back_inserter<std::string>/string_view len = 6                54.6 
ns         54.6 ns     12818233
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6          69.9 
ns         69.9 ns     10018025
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6            154 
ns          154 ns      4534215
BM_format_to_back_inserter<std::list<char>>/string_view len = 6             131 
ns          131 ns      5337938
BM_format_to_iterator/<std::array> string_view len = 6                     44.2 
ns         44.2 ns     15854695
BM_format_to_iterator/<std::string> string_view len = 6                    45.0 
ns         45.0 ns     15551054
BM_format_to_iterator/<std::vector> string_view len = 6                    45.0 
ns         45.0 ns     15567905
BM_format_to_iterator/<std::deque> string_view len = 6                     50.5 
ns         50.5 ns     13858261
BM_sprintf/C string len = 60                                               4.16 
ns         4.16 ns    168066307
BM_format/C string len = 60                                                73.8 
ns         73.8 ns      9487364
BM_format_to_back_inserter<std::string>/C string len = 60                  73.7 
ns         73.7 ns      9492371
BM_format_to_back_inserter<std::vector<char>>/C string len = 60            83.1 
ns         83.1 ns      8399017
BM_format_to_back_inserter<std::deque<char>>/C string len = 60              284 
ns          284 ns      2466510
BM_format_to_back_inserter<std::list<char>>/C string len = 60              1177 
ns         1177 ns       592514
BM_format_to_iterator/<std::array> C string len = 60                       44.9 
ns         44.9 ns     15558172
BM_format_to_iterator/<std::string> C string len = 60                      45.8 
ns         45.8 ns     15283103
BM_format_to_iterator/<std::vector> C string len = 60                      44.6 
ns         44.6 ns     15678967
BM_format_to_iterator/<std::deque> C string len = 60                       50.5 
ns         50.5 ns     13839524
BM_format/string len = 60                                                  72.2 
ns         72.2 ns      9687634
BM_format_to_back_inserter<std::string>/string len = 60                    72.0 
ns         72.1 ns      9695746
BM_format_to_back_inserter<std::vector<char>>/string len = 60              82.3 
ns         82.3 ns      8509528
BM_format_to_back_inserter<std::deque<char>>/string len = 60                279 
ns          279 ns      2506108
BM_format_to_back_inserter<std::list<char>>/string len = 60                1180 
ns         1180 ns       592963
BM_format_to_iterator/<std::array> string len = 60                         44.7 
ns         44.7 ns     15657865
BM_format_to_iterator/<std::string> string len = 60                        45.0 
ns         45.0 ns     15569049
BM_format_to_iterator/<std::vector> string len = 60                        44.9 
ns         44.9 ns     15576187
BM_format_to_iterator/<std::deque> string len = 60                         50.7 
ns         50.7 ns     13803188
BM_format/string_view len = 60                                             72.4 
ns         72.4 ns      9663061
BM_format_to_back_inserter<std::string>/string_view len = 60               72.8 
ns         72.8 ns      9638941
BM_format_to_back_inserter<std::vector<char>>/string_view len = 60         81.9 
ns         81.9 ns      8529931
BM_format_to_back_inserter<std::deque<char>>/string_view len = 60           283 
ns          283 ns      2471522
BM_format_to_back_inserter<std::list<char>>/string_view len = 60           1177 
ns         1177 ns       594752
BM_format_to_iterator/<std::array> string_view len = 60                    44.2 
ns         44.2 ns     15841413
BM_format_to_iterator/<std::string> string_view len = 60                   45.1 
ns         45.1 ns     15546279
BM_format_to_iterator/<std::vector> string_view len = 60                   45.0 
ns         45.0 ns     15555756
BM_format_to_iterator/<std::deque> string_view len = 60                    50.1 
ns         50.1 ns     10000000
BM_sprintf/C string len = 6000                                              344 
ns          344 ns      2037753
BM_format/C string len = 6000                                               980 
ns          980 ns       713341
BM_format_to_back_inserter<std::string>/C string len = 6000                 979 
ns          979 ns       709571
BM_format_to_back_inserter<std::vector<char>>/C string len = 6000           944 
ns          944 ns       744518
BM_format_to_back_inserter<std::deque<char>>/C string len = 6000          14916 
ns        14915 ns        46875
BM_format_to_back_inserter<std::list<char>>/C string len = 6000          114686 
ns       114688 ns         6110
BM_format_to_iterator/<std::array> C string len = 6000                      159 
ns          159 ns      4394506
BM_format_to_iterator/<std::string> C string len = 6000                     159 
ns          159 ns      4384577
BM_format_to_iterator/<std::vector> C string len = 6000                     159 
ns          159 ns      4393225
BM_format_to_iterator/<std::deque> C string len = 6000                      437 
ns          437 ns      1601253
BM_format/string len = 6000                                                 929 
ns          929 ns       751889
BM_format_to_back_inserter<std::string>/string len = 6000                   933 
ns          933 ns       752042
BM_format_to_back_inserter<std::vector<char>>/string len = 6000             892 
ns          892 ns       785064
BM_format_to_back_inserter<std::deque<char>>/string len = 6000            14840 
ns        14839 ns        47177
BM_format_to_back_inserter<std::list<char>>/string len = 6000            114940 
ns       114942 ns         6095
BM_format_to_iterator/<std::array> string len = 6000                        144 
ns          144 ns      4859849
BM_format_to_iterator/<std::string> string len = 6000                       106 
ns          106 ns      6565564
BM_format_to_iterator/<std::vector> string len = 6000                       107 
ns          107 ns      6584152
BM_format_to_iterator/<std::deque> string len = 6000                        368 
ns          368 ns      1904727
BM_format/string_view len = 6000                                            919 
ns          919 ns       760401
BM_format_to_back_inserter<std::string>/string_view len = 6000              917 
ns          917 ns       760934
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6000        880 
ns          880 ns       796244
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6000       14854 
ns        14853 ns        47101
BM_format_to_back_inserter<std::list<char>>/string_view len = 6000       114963 
ns       114967 ns         6086
BM_format_to_iterator/<std::array> string_view len = 6000                   117 
ns          117 ns      5974080
BM_format_to_iterator/<std::string> string_view len = 6000                  116 
ns          116 ns      6016080
BM_format_to_iterator/<std::vector> string_view len = 6000                  116 
ns          116 ns      6053780
BM_format_to_iterator/<std::deque> string_view len = 6000                   351 
ns          351 ns      1993879

Comparing libcxx/benchmarks/1/write_string_comparison.bench.out to 
libcxx/benchmarks/2/write_string_comparison.bench.out
Benchmark                                                                       
       Time             CPU      Time Old      Time New       CPU Old       CPU 
New
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
BM_sprintf/C string len = 6                                                     
    +0.0034         +0.0058             5             5             5           
  5
BM_format/C string len = 6                                                      
    +0.0484         +0.0508            53            55            52           
 55
BM_format_to_back_inserter<std::string>/C string len = 6                        
    +0.0395         +0.0424            53            55            53           
 55
BM_format_to_back_inserter<std::vector<char>>/C string len = 6                  
    +0.0220         +0.0244            70            71            70           
 71
BM_format_to_back_inserter<std::deque<char>>/C string len = 6                   
    +0.0399         +0.0424           148           154           148           
154
BM_format_to_back_inserter<std::list<char>>/C string len = 6                    
    +0.0339         +0.0365           127           131           126           
131
BM_format_to_iterator/<std::array> C string len = 6                             
    +0.0494         +0.0520            43            45            43           
 45
BM_format_to_iterator/<std::string> C string len = 6                            
    +0.0539         +0.0568            44            46            43           
 46
BM_format_to_iterator/<std::vector> C string len = 6                            
    +0.0359         +0.0384            43            44            43           
 44
BM_format_to_iterator/<std::deque> C string len = 6                             
    +0.0488         +0.0513            48            50            48           
 50
BM_format/string len = 6                                                        
    -0.0105         -0.0081            55            55            55           
 55
BM_format_to_back_inserter<std::string>/string len = 6                          
    +0.0008         +0.0036            55            55            55           
 55
BM_format_to_back_inserter<std::vector<char>>/string len = 6                    
    -0.0046         -0.0021            71            70            71           
 70
BM_format_to_back_inserter<std::deque<char>>/string len = 6                     
    +0.0066         +0.0091           153           154           153           
154
BM_format_to_back_inserter<std::list<char>>/string len = 6                      
    +0.0291         +0.0316           128           132           128           
132
BM_format_to_iterator/<std::array> string len = 6                               
    -0.0030         -0.0006            45            44            44           
 44
BM_format_to_iterator/<std::string> string len = 6                              
    +0.0045         +0.0069            45            45            45           
 45
BM_format_to_iterator/<std::vector> string len = 6                              
    +0.0150         +0.0177            44            45            44           
 45
BM_format_to_iterator/<std::deque> string len = 6                               
    +0.0059         +0.0084            50            51            50           
 51
BM_format/string_view len = 6                                                   
    +0.0050         +0.0075            54            55            54           
 55
BM_format_to_back_inserter<std::string>/string_view len = 6                     
    +0.0052         +0.0081            54            55            54           
 55
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6               
    -0.0017         +0.0008            70            70            70           
 70
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6                
    +0.0113         +0.0137           153           154           152           
154
BM_format_to_back_inserter<std::list<char>>/string_view len = 6                 
    +0.0260         +0.0286           128           131           128           
131
BM_format_to_iterator/<std::array> string_view len = 6                          
    -0.0006         +0.0021            44            44            44           
 44
BM_format_to_iterator/<std::string> string_view len = 6                         
    +0.0059         +0.0084            45            45            45           
 45
BM_format_to_iterator/<std::vector> string_view len = 6                         
    +0.0083         +0.0108            45            45            45           
 45
BM_format_to_iterator/<std::deque> string_view len = 6                          
    +0.0048         +0.0073            50            51            50           
 51
BM_sprintf/C string len = 60                                                    
    +0.0002         +0.0029             4             4             4           
  4
BM_format/C string len = 60                                                     
    -0.5640         -0.5629           169            74           169           
 74
BM_format_to_back_inserter<std::string>/C string len = 60                       
    -0.5592         -0.5582           167            74           167           
 74
BM_format_to_back_inserter<std::vector<char>>/C string len = 60                 
    -0.5294         -0.5282           177            83           176           
 83
BM_format_to_back_inserter<std::deque<char>>/C string len = 60                  
    -0.2591         -0.2570           383           284           382           
284
BM_format_to_back_inserter<std::list<char>>/C string len = 60                   
    -0.0730         -0.0707          1270          1177          1267          
1177
BM_format_to_iterator/<std::array> C string len = 60                            
    -0.6804         -0.6797           141            45           140           
 45
BM_format_to_iterator/<std::string> C string len = 60                           
    -0.6759         -0.6750           141            46           141           
 46
BM_format_to_iterator/<std::vector> C string len = 60                           
    -0.6849         -0.6841           141            45           141           
 45
BM_format_to_iterator/<std::deque> C string len = 60                            
    -0.6481         -0.6471           144            51           143           
 51
BM_format/string len = 60                                                       
    -0.0167         -0.0142            73            72            73           
 72
BM_format_to_back_inserter<std::string>/string len = 60                         
    -0.0151         -0.0127            73            72            73           
 72
BM_format_to_back_inserter<std::vector<char>>/string len = 60                   
    +0.0093         +0.0118            82            82            81           
 82
BM_format_to_back_inserter<std::deque<char>>/string len = 60                    
    -0.0003         +0.0023           279           279           279           
279
BM_format_to_back_inserter<std::list<char>>/string len = 60                     
    +0.0025         +0.0050          1177          1180          1174          
1180
BM_format_to_iterator/<std::array> string len = 60                              
    +0.0046         +0.0070            45            45            44           
 45
BM_format_to_iterator/<std::string> string len = 60                             
    +0.0050         +0.0075            45            45            45           
 45
BM_format_to_iterator/<std::vector> string len = 60                             
    +0.0025         +0.0051            45            45            45           
 45
BM_format_to_iterator/<std::deque> string len = 60                              
    +0.0031         +0.0056            51            51            50           
 51
BM_format/string_view len = 60                                                  
    -0.0054         -0.0030            73            72            73           
 72
BM_format_to_back_inserter<std::string>/string_view len = 60                    
    +0.0001         +0.0026            73            73            73           
 73
BM_format_to_back_inserter<std::vector<char>>/string_view len = 60              
    -0.0090         -0.0066            83            82            82           
 82
BM_format_to_back_inserter<std::deque<char>>/string_view len = 60               
    +0.0097         +0.0126           280           283           280           
283
BM_format_to_back_inserter<std::list<char>>/string_view len = 60                
    +0.0011         +0.0036          1176          1177          1173          
1177
BM_format_to_iterator/<std::array> string_view len = 60                         
    +0.0001         +0.0026            44            44            44           
 44
BM_format_to_iterator/<std::string> string_view len = 60                        
    +0.0083         +0.0107            45            45            45           
 45
BM_format_to_iterator/<std::vector> string_view len = 60                        
    +0.0068         +0.0093            45            45            45           
 45
BM_format_to_iterator/<std::deque> string_view len = 60                         
    -0.0038         -0.0014            50            50            50           
 50
BM_sprintf/C string len = 6000                                                  
    +2.0230         +2.0305           114           344           114           
344
BM_format/C string len = 6000                                                   
    -0.9169         -0.9167         11792           980         11763           
980
BM_format_to_back_inserter<std::string>/C string len = 6000                     
    -0.9169         -0.9166         11778           979         11746           
979
BM_format_to_back_inserter<std::vector<char>>/C string len = 6000               
    -0.9194         -0.9192         11715           944         11686           
944
BM_format_to_back_inserter<std::deque<char>>/C string len = 6000                
    -0.4143         -0.4129         25464         14916         25403         
14915
BM_format_to_back_inserter<std::list<char>>/C string len = 6000                 
    -0.0901         -0.0878        126044        114686        125726        
114688
BM_format_to_iterator/<std::array> C string len = 6000                          
    -0.9852         -0.9852         10792           159         10766           
159
BM_format_to_iterator/<std::string> C string len = 6000                         
    -0.9852         -0.9852         10791           159         10761           
159
BM_format_to_iterator/<std::vector> C string len = 6000                         
    -0.9852         -0.9852         10775           159         10750           
159
BM_format_to_iterator/<std::deque> C string len = 6000                          
    -0.9611         -0.9610         11242           437         11215           
437
BM_format/string len = 6000                                                     
    +0.0108         +0.0133           919           929           917           
929
BM_format_to_back_inserter<std::string>/string len = 6000                       
    +0.0138         +0.0167           920           933           917           
933
BM_format_to_back_inserter<std::vector<char>>/string len = 6000                 
    +0.0041         +0.0064           888           892           886           
892
BM_format_to_back_inserter<std::deque<char>>/string len = 6000                  
    -0.0107         -0.0082         14999         14840         14963         
14839
BM_format_to_back_inserter<std::list<char>>/string len = 6000                   
    +0.0038         +0.0064        114504        114940        114213        
114942
BM_format_to_iterator/<std::array> string len = 6000                            
    +0.2011         +0.2040           120           144           120           
144
BM_format_to_iterator/<std::string> string len = 6000                           
    +0.0032         +0.0057           106           106           106           
106
BM_format_to_iterator/<std::vector> string len = 6000                           
    +0.0057         +0.0085           106           107           106           
107
BM_format_to_iterator/<std::deque> string len = 6000                            
    +0.0011         +0.0036           367           368           366           
368
BM_format/string_view len = 6000                                                
    +0.0105         +0.0130           910           919           907           
919
BM_format_to_back_inserter<std::string>/string_view len = 6000                  
    +0.0057         +0.0081           911           917           909           
917
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6000            
    +0.0023         +0.0050           878           880           876           
880
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6000             
    -0.0118         -0.0094         15031         14854         14994         
14853
BM_format_to_back_inserter<std::list<char>>/string_view len = 6000              
    +0.0040         +0.0065        114510        114963        114219        
114967
BM_format_to_iterator/<std::array> string_view len = 6000                       
    -0.0299         -0.0275           121           117           120           
117
BM_format_to_iterator/<std::string> string_view len = 6000                      
    +0.0062         +0.0086           116           116           115           
116
BM_format_to_iterator/<std::vector> string_view len = 6000                      
    +0.0034         +0.0062           115           116           115           
116
BM_format_to_iterator/<std::deque> string_view len = 6000                       
    +0.0011         +0.0035           351           351           350           
351
OVERALL_GEOMEAN                                                                 
    -0.2959         -0.2941             0             0             0           
  0

>From f46ff67a50d657281a059b3964406e1cc0f8b9bb Mon Sep 17 00:00:00 2001
From: Mark de Wever <ko...@xs4all.nl>
Date: Sat, 30 Mar 2024 17:35:56 +0100
Subject: [PATCH] [libc++][format][2/7] Optimizes c-string arguments.

The formatter specializations for _CharT* and const _CharT* typically
write all elements in a loop. This format's internal functions are
optimized for larger writes.

Instead of writing one element at a time conversion the range to a
basic_string_view and write that instead.

For C string of 6 characters this is a bit slower, but for 60 characters
it's faster. The improvements for back_inserter<std::list<_CharT>> are not
as great as the others; it just gets as slow as basic_string_view<_CharT>.

Before
---------------------------------------------------------------------------------------------------------------
Benchmark                                                                     
Time             CPU   Iterations
---------------------------------------------------------------------------------------------------------------
BM_sprintf/C string len = 6                                                4.81 
ns         4.80 ns    145890280
BM_format/C string len = 6                                                 52.6 
ns         52.4 ns     13252327
BM_format_to_back_inserter<std::string>/C string len = 6                   53.0 
ns         52.8 ns     13262680
BM_format_to_back_inserter<std::vector<char>>/C string len = 6             69.7 
ns         69.6 ns     10045636
BM_format_to_back_inserter<std::deque<char>>/C string len = 6               148 
ns          148 ns      4729368
BM_format_to_back_inserter<std::list<char>>/C string len = 6                127 
ns          126 ns      5538441
BM_format_to_iterator/<std::array> C string len = 6                        42.9 
ns         42.8 ns     16367158
BM_format_to_iterator/<std::string> C string len = 6                       43.5 
ns         43.4 ns     16141644
BM_format_to_iterator/<std::vector> C string len = 6                       42.9 
ns         42.8 ns     16366718
BM_format_to_iterator/<std::deque> C string len = 6                        47.8 
ns         47.7 ns     14686488
BM_format/string len = 6                                                   55.3 
ns         55.2 ns     12696889
BM_format_to_back_inserter<std::string>/string len = 6                     55.4 
ns         55.2 ns     12660731
BM_format_to_back_inserter<std::vector<char>>/string len = 6               70.7 
ns         70.5 ns      9927313
BM_format_to_back_inserter<std::deque<char>>/string len = 6                 153 
ns          153 ns      4573936
BM_format_to_back_inserter<std::list<char>>/string len = 6                  128 
ns          128 ns      5486033
BM_format_to_iterator/<std::array> string len = 6                          44.6 
ns         44.5 ns     15758122
BM_format_to_iterator/<std::string> string len = 6                         44.7 
ns         44.6 ns     15690226
BM_format_to_iterator/<std::vector> string len = 6                         44.3 
ns         44.2 ns     15715898
BM_format_to_iterator/<std::deque> string len = 6                          50.3 
ns         50.1 ns     13958635
BM_format/string_view len = 6                                              54.2 
ns         54.1 ns     12929525
BM_format_to_back_inserter<std::string>/string_view len = 6                54.3 
ns         54.1 ns     12929219
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6          70.0 
ns         69.8 ns     10022355
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6            153 
ns          152 ns      4585749
BM_format_to_back_inserter<std::list<char>>/string_view len = 6             128 
ns          128 ns      5489760
BM_format_to_iterator/<std::array> string_view len = 6                     44.2 
ns         44.1 ns     15884839
BM_format_to_iterator/<std::string> string_view len = 6                    44.8 
ns         44.6 ns     15664278
BM_format_to_iterator/<std::vector> string_view len = 6                    44.7 
ns         44.6 ns     15716983
BM_format_to_iterator/<std::deque> string_view len = 6                     50.3 
ns         50.2 ns     13936091
BM_sprintf/C string len = 60                                               4.16 
ns         4.15 ns    168764227
BM_format/C string len = 60                                                 169 
ns          169 ns      4144060
BM_format_to_back_inserter<std::string>/C string len = 60                   167 
ns          167 ns      4203915
BM_format_to_back_inserter<std::vector<char>>/C string len = 60             177 
ns          176 ns      3965619
BM_format_to_back_inserter<std::deque<char>>/C string len = 60              383 
ns          382 ns      1832531
BM_format_to_back_inserter<std::list<char>>/C string len = 60              1270 
ns         1267 ns       552686
BM_format_to_iterator/<std::array> C string len = 60                        141 
ns          140 ns      4988441
BM_format_to_iterator/<std::string> C string len = 60                       141 
ns          141 ns      4956101
BM_format_to_iterator/<std::vector> C string len = 60                       141 
ns          141 ns      4963443
BM_format_to_iterator/<std::deque> C string len = 60                        144 
ns          143 ns      4893139
BM_format/string len = 60                                                  73.4 
ns         73.2 ns      9548455
BM_format_to_back_inserter<std::string>/string len = 60                    73.2 
ns         73.0 ns      9524524
BM_format_to_back_inserter<std::vector<char>>/string len = 60              81.6 
ns         81.4 ns      8584033
BM_format_to_back_inserter<std::deque<char>>/string len = 60                279 
ns          279 ns      2515146
BM_format_to_back_inserter<std::list<char>>/string len = 60                1177 
ns         1174 ns       597172
BM_format_to_iterator/<std::array> string len = 60                         44.5 
ns         44.4 ns     15753131
BM_format_to_iterator/<std::string> string len = 60                        44.7 
ns         44.6 ns     15692630
BM_format_to_iterator/<std::vector> string len = 60                        44.8 
ns         44.7 ns     15664689
BM_format_to_iterator/<std::deque> string len = 60                         50.6 
ns         50.5 ns     13838617
BM_format/string_view len = 60                                             72.8 
ns         72.6 ns      9674007
BM_format_to_back_inserter<std::string>/string_view len = 60               72.7 
ns         72.6 ns      9638209
BM_format_to_back_inserter<std::vector<char>>/string_view len = 60         82.6 
ns         82.4 ns      8496602
BM_format_to_back_inserter<std::deque<char>>/string_view len = 60           280 
ns          280 ns      2508982
BM_format_to_back_inserter<std::list<char>>/string_view len = 60           1176 
ns         1173 ns       597714
BM_format_to_iterator/<std::array> string_view len = 60                    44.2 
ns         44.1 ns     15896934
BM_format_to_iterator/<std::string> string_view len = 60                   44.7 
ns         44.6 ns     15695427
BM_format_to_iterator/<std::vector> string_view len = 60                   44.7 
ns         44.6 ns     15680899
BM_format_to_iterator/<std::deque> string_view len = 60                    50.3 
ns         50.1 ns     13962755
BM_sprintf/C string len = 6000                                              114 
ns          114 ns      6170153
BM_format/C string len = 6000                                             11792 
ns        11763 ns        59619
BM_format_to_back_inserter<std::string>/C string len = 6000               11778 
ns        11746 ns        59572
BM_format_to_back_inserter<std::vector<char>>/C string len = 6000         11715 
ns        11686 ns        60053
BM_format_to_back_inserter<std::deque<char>>/C string len = 6000          25464 
ns        25403 ns        27538
BM_format_to_back_inserter<std::list<char>>/C string len = 6000          126044 
ns       125726 ns         5572
BM_format_to_iterator/<std::array> C string len = 6000                    10792 
ns        10766 ns        64943
BM_format_to_iterator/<std::string> C string len = 6000                   10791 
ns        10761 ns        64918
BM_format_to_iterator/<std::vector> C string len = 6000                   10775 
ns        10750 ns        65149
BM_format_to_iterator/<std::deque> C string len = 6000                    11242 
ns        11215 ns        62542
BM_format/string len = 6000                                                 919 
ns          917 ns       763961
BM_format_to_back_inserter<std::string>/string len = 6000                   920 
ns          917 ns       763094
BM_format_to_back_inserter<std::vector<char>>/string len = 6000             888 
ns          886 ns       793468
BM_format_to_back_inserter<std::deque<char>>/string len = 6000            14999 
ns        14963 ns        46758
BM_format_to_back_inserter<std::list<char>>/string len = 6000            114504 
ns       114213 ns         6130
BM_format_to_iterator/<std::array> string len = 6000                        120 
ns          120 ns      5823426
BM_format_to_iterator/<std::string> string len = 6000                       106 
ns          106 ns      6609299
BM_format_to_iterator/<std::vector> string len = 6000                       106 
ns          106 ns      6613867
BM_format_to_iterator/<std::deque> string len = 6000                        367 
ns          366 ns      1912818
BM_format/string_view len = 6000                                            910 
ns          907 ns       771491
BM_format_to_back_inserter<std::string>/string_view len = 6000              911 
ns          909 ns       770065
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6000        878 
ns          876 ns       794976
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6000       15031 
ns        14994 ns        46651
BM_format_to_back_inserter<std::list<char>>/string_view len = 6000       114510 
ns       114219 ns         6130
BM_format_to_iterator/<std::array> string_view len = 6000                   121 
ns          120 ns      5814249
BM_format_to_iterator/<std::string> string_view len = 6000                  116 
ns          115 ns      6072315
BM_format_to_iterator/<std::vector> string_view len = 6000                  115 
ns          115 ns      6095762
BM_format_to_iterator/<std::deque> string_view len = 6000                   351 
ns          350 ns      2002175

After
---------------------------------------------------------------------------------------------------------------
Benchmark                                                                     
Time             CPU   Iterations
---------------------------------------------------------------------------------------------------------------
BM_sprintf/C string len = 6                                                4.83 
ns         4.83 ns    145502957
BM_format/C string len = 6                                                 55.1 
ns         55.1 ns     12687656
BM_format_to_back_inserter<std::string>/C string len = 6                   55.1 
ns         55.1 ns     12691642
BM_format_to_back_inserter<std::vector<char>>/C string len = 6             71.2 
ns         71.3 ns      9819560
BM_format_to_back_inserter<std::deque<char>>/C string len = 6               154 
ns          154 ns      4548709
BM_format_to_back_inserter<std::list<char>>/C string len = 6                131 
ns          131 ns      5338318
BM_format_to_iterator/<std::array> C string len = 6                        45.0 
ns         45.0 ns     15569429
BM_format_to_iterator/<std::string> C string len = 6                       45.9 
ns         45.9 ns     15240594
BM_format_to_iterator/<std::vector> C string len = 6                       44.4 
ns         44.4 ns     15768343
BM_format_to_iterator/<std::deque> C string len = 6                        50.1 
ns         50.1 ns     13995837
BM_format/string len = 6                                                   54.8 
ns         54.8 ns     12738209
BM_format_to_back_inserter<std::string>/string len = 6                     55.4 
ns         55.4 ns     12634483
BM_format_to_back_inserter<std::vector<char>>/string len = 6               70.4 
ns         70.4 ns      9948288
BM_format_to_back_inserter<std::deque<char>>/string len = 6                 154 
ns          154 ns      4531741
BM_format_to_back_inserter<std::list<char>>/string len = 6                  132 
ns          132 ns      5289798
BM_format_to_iterator/<std::array> string len = 6                          44.5 
ns         44.5 ns     15743437
BM_format_to_iterator/<std::string> string len = 6                         44.9 
ns         44.9 ns     15591961
BM_format_to_iterator/<std::vector> string len = 6                         45.0 
ns         45.0 ns     15541308
BM_format_to_iterator/<std::deque> string len = 6                          50.5 
ns         50.5 ns     13837884
BM_format/string_view len = 6                                              54.5 
ns         54.5 ns     12833591
BM_format_to_back_inserter<std::string>/string_view len = 6                54.6 
ns         54.6 ns     12818233
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6          69.9 
ns         69.9 ns     10018025
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6            154 
ns          154 ns      4534215
BM_format_to_back_inserter<std::list<char>>/string_view len = 6             131 
ns          131 ns      5337938
BM_format_to_iterator/<std::array> string_view len = 6                     44.2 
ns         44.2 ns     15854695
BM_format_to_iterator/<std::string> string_view len = 6                    45.0 
ns         45.0 ns     15551054
BM_format_to_iterator/<std::vector> string_view len = 6                    45.0 
ns         45.0 ns     15567905
BM_format_to_iterator/<std::deque> string_view len = 6                     50.5 
ns         50.5 ns     13858261
BM_sprintf/C string len = 60                                               4.16 
ns         4.16 ns    168066307
BM_format/C string len = 60                                                73.8 
ns         73.8 ns      9487364
BM_format_to_back_inserter<std::string>/C string len = 60                  73.7 
ns         73.7 ns      9492371
BM_format_to_back_inserter<std::vector<char>>/C string len = 60            83.1 
ns         83.1 ns      8399017
BM_format_to_back_inserter<std::deque<char>>/C string len = 60              284 
ns          284 ns      2466510
BM_format_to_back_inserter<std::list<char>>/C string len = 60              1177 
ns         1177 ns       592514
BM_format_to_iterator/<std::array> C string len = 60                       44.9 
ns         44.9 ns     15558172
BM_format_to_iterator/<std::string> C string len = 60                      45.8 
ns         45.8 ns     15283103
BM_format_to_iterator/<std::vector> C string len = 60                      44.6 
ns         44.6 ns     15678967
BM_format_to_iterator/<std::deque> C string len = 60                       50.5 
ns         50.5 ns     13839524
BM_format/string len = 60                                                  72.2 
ns         72.2 ns      9687634
BM_format_to_back_inserter<std::string>/string len = 60                    72.0 
ns         72.1 ns      9695746
BM_format_to_back_inserter<std::vector<char>>/string len = 60              82.3 
ns         82.3 ns      8509528
BM_format_to_back_inserter<std::deque<char>>/string len = 60                279 
ns          279 ns      2506108
BM_format_to_back_inserter<std::list<char>>/string len = 60                1180 
ns         1180 ns       592963
BM_format_to_iterator/<std::array> string len = 60                         44.7 
ns         44.7 ns     15657865
BM_format_to_iterator/<std::string> string len = 60                        45.0 
ns         45.0 ns     15569049
BM_format_to_iterator/<std::vector> string len = 60                        44.9 
ns         44.9 ns     15576187
BM_format_to_iterator/<std::deque> string len = 60                         50.7 
ns         50.7 ns     13803188
BM_format/string_view len = 60                                             72.4 
ns         72.4 ns      9663061
BM_format_to_back_inserter<std::string>/string_view len = 60               72.8 
ns         72.8 ns      9638941
BM_format_to_back_inserter<std::vector<char>>/string_view len = 60         81.9 
ns         81.9 ns      8529931
BM_format_to_back_inserter<std::deque<char>>/string_view len = 60           283 
ns          283 ns      2471522
BM_format_to_back_inserter<std::list<char>>/string_view len = 60           1177 
ns         1177 ns       594752
BM_format_to_iterator/<std::array> string_view len = 60                    44.2 
ns         44.2 ns     15841413
BM_format_to_iterator/<std::string> string_view len = 60                   45.1 
ns         45.1 ns     15546279
BM_format_to_iterator/<std::vector> string_view len = 60                   45.0 
ns         45.0 ns     15555756
BM_format_to_iterator/<std::deque> string_view len = 60                    50.1 
ns         50.1 ns     10000000
BM_sprintf/C string len = 6000                                              344 
ns          344 ns      2037753
BM_format/C string len = 6000                                               980 
ns          980 ns       713341
BM_format_to_back_inserter<std::string>/C string len = 6000                 979 
ns          979 ns       709571
BM_format_to_back_inserter<std::vector<char>>/C string len = 6000           944 
ns          944 ns       744518
BM_format_to_back_inserter<std::deque<char>>/C string len = 6000          14916 
ns        14915 ns        46875
BM_format_to_back_inserter<std::list<char>>/C string len = 6000          114686 
ns       114688 ns         6110
BM_format_to_iterator/<std::array> C string len = 6000                      159 
ns          159 ns      4394506
BM_format_to_iterator/<std::string> C string len = 6000                     159 
ns          159 ns      4384577
BM_format_to_iterator/<std::vector> C string len = 6000                     159 
ns          159 ns      4393225
BM_format_to_iterator/<std::deque> C string len = 6000                      437 
ns          437 ns      1601253
BM_format/string len = 6000                                                 929 
ns          929 ns       751889
BM_format_to_back_inserter<std::string>/string len = 6000                   933 
ns          933 ns       752042
BM_format_to_back_inserter<std::vector<char>>/string len = 6000             892 
ns          892 ns       785064
BM_format_to_back_inserter<std::deque<char>>/string len = 6000            14840 
ns        14839 ns        47177
BM_format_to_back_inserter<std::list<char>>/string len = 6000            114940 
ns       114942 ns         6095
BM_format_to_iterator/<std::array> string len = 6000                        144 
ns          144 ns      4859849
BM_format_to_iterator/<std::string> string len = 6000                       106 
ns          106 ns      6565564
BM_format_to_iterator/<std::vector> string len = 6000                       107 
ns          107 ns      6584152
BM_format_to_iterator/<std::deque> string len = 6000                        368 
ns          368 ns      1904727
BM_format/string_view len = 6000                                            919 
ns          919 ns       760401
BM_format_to_back_inserter<std::string>/string_view len = 6000              917 
ns          917 ns       760934
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6000        880 
ns          880 ns       796244
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6000       14854 
ns        14853 ns        47101
BM_format_to_back_inserter<std::list<char>>/string_view len = 6000       114963 
ns       114967 ns         6086
BM_format_to_iterator/<std::array> string_view len = 6000                   117 
ns          117 ns      5974080
BM_format_to_iterator/<std::string> string_view len = 6000                  116 
ns          116 ns      6016080
BM_format_to_iterator/<std::vector> string_view len = 6000                  116 
ns          116 ns      6053780
BM_format_to_iterator/<std::deque> string_view len = 6000                   351 
ns          351 ns      1993879

Comparing libcxx/benchmarks/1/write_string_comparison.bench.out to 
libcxx/benchmarks/2/write_string_comparison.bench.out
Benchmark                                                                       
       Time             CPU      Time Old      Time New       CPU Old       CPU 
New
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
BM_sprintf/C string len = 6                                                     
    +0.0034         +0.0058             5             5             5           
  5
BM_format/C string len = 6                                                      
    +0.0484         +0.0508            53            55            52           
 55
BM_format_to_back_inserter<std::string>/C string len = 6                        
    +0.0395         +0.0424            53            55            53           
 55
BM_format_to_back_inserter<std::vector<char>>/C string len = 6                  
    +0.0220         +0.0244            70            71            70           
 71
BM_format_to_back_inserter<std::deque<char>>/C string len = 6                   
    +0.0399         +0.0424           148           154           148           
154
BM_format_to_back_inserter<std::list<char>>/C string len = 6                    
    +0.0339         +0.0365           127           131           126           
131
BM_format_to_iterator/<std::array> C string len = 6                             
    +0.0494         +0.0520            43            45            43           
 45
BM_format_to_iterator/<std::string> C string len = 6                            
    +0.0539         +0.0568            44            46            43           
 46
BM_format_to_iterator/<std::vector> C string len = 6                            
    +0.0359         +0.0384            43            44            43           
 44
BM_format_to_iterator/<std::deque> C string len = 6                             
    +0.0488         +0.0513            48            50            48           
 50
BM_format/string len = 6                                                        
    -0.0105         -0.0081            55            55            55           
 55
BM_format_to_back_inserter<std::string>/string len = 6                          
    +0.0008         +0.0036            55            55            55           
 55
BM_format_to_back_inserter<std::vector<char>>/string len = 6                    
    -0.0046         -0.0021            71            70            71           
 70
BM_format_to_back_inserter<std::deque<char>>/string len = 6                     
    +0.0066         +0.0091           153           154           153           
154
BM_format_to_back_inserter<std::list<char>>/string len = 6                      
    +0.0291         +0.0316           128           132           128           
132
BM_format_to_iterator/<std::array> string len = 6                               
    -0.0030         -0.0006            45            44            44           
 44
BM_format_to_iterator/<std::string> string len = 6                              
    +0.0045         +0.0069            45            45            45           
 45
BM_format_to_iterator/<std::vector> string len = 6                              
    +0.0150         +0.0177            44            45            44           
 45
BM_format_to_iterator/<std::deque> string len = 6                               
    +0.0059         +0.0084            50            51            50           
 51
BM_format/string_view len = 6                                                   
    +0.0050         +0.0075            54            55            54           
 55
BM_format_to_back_inserter<std::string>/string_view len = 6                     
    +0.0052         +0.0081            54            55            54           
 55
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6               
    -0.0017         +0.0008            70            70            70           
 70
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6                
    +0.0113         +0.0137           153           154           152           
154
BM_format_to_back_inserter<std::list<char>>/string_view len = 6                 
    +0.0260         +0.0286           128           131           128           
131
BM_format_to_iterator/<std::array> string_view len = 6                          
    -0.0006         +0.0021            44            44            44           
 44
BM_format_to_iterator/<std::string> string_view len = 6                         
    +0.0059         +0.0084            45            45            45           
 45
BM_format_to_iterator/<std::vector> string_view len = 6                         
    +0.0083         +0.0108            45            45            45           
 45
BM_format_to_iterator/<std::deque> string_view len = 6                          
    +0.0048         +0.0073            50            51            50           
 51
BM_sprintf/C string len = 60                                                    
    +0.0002         +0.0029             4             4             4           
  4
BM_format/C string len = 60                                                     
    -0.5640         -0.5629           169            74           169           
 74
BM_format_to_back_inserter<std::string>/C string len = 60                       
    -0.5592         -0.5582           167            74           167           
 74
BM_format_to_back_inserter<std::vector<char>>/C string len = 60                 
    -0.5294         -0.5282           177            83           176           
 83
BM_format_to_back_inserter<std::deque<char>>/C string len = 60                  
    -0.2591         -0.2570           383           284           382           
284
BM_format_to_back_inserter<std::list<char>>/C string len = 60                   
    -0.0730         -0.0707          1270          1177          1267          
1177
BM_format_to_iterator/<std::array> C string len = 60                            
    -0.6804         -0.6797           141            45           140           
 45
BM_format_to_iterator/<std::string> C string len = 60                           
    -0.6759         -0.6750           141            46           141           
 46
BM_format_to_iterator/<std::vector> C string len = 60                           
    -0.6849         -0.6841           141            45           141           
 45
BM_format_to_iterator/<std::deque> C string len = 60                            
    -0.6481         -0.6471           144            51           143           
 51
BM_format/string len = 60                                                       
    -0.0167         -0.0142            73            72            73           
 72
BM_format_to_back_inserter<std::string>/string len = 60                         
    -0.0151         -0.0127            73            72            73           
 72
BM_format_to_back_inserter<std::vector<char>>/string len = 60                   
    +0.0093         +0.0118            82            82            81           
 82
BM_format_to_back_inserter<std::deque<char>>/string len = 60                    
    -0.0003         +0.0023           279           279           279           
279
BM_format_to_back_inserter<std::list<char>>/string len = 60                     
    +0.0025         +0.0050          1177          1180          1174          
1180
BM_format_to_iterator/<std::array> string len = 60                              
    +0.0046         +0.0070            45            45            44           
 45
BM_format_to_iterator/<std::string> string len = 60                             
    +0.0050         +0.0075            45            45            45           
 45
BM_format_to_iterator/<std::vector> string len = 60                             
    +0.0025         +0.0051            45            45            45           
 45
BM_format_to_iterator/<std::deque> string len = 60                              
    +0.0031         +0.0056            51            51            50           
 51
BM_format/string_view len = 60                                                  
    -0.0054         -0.0030            73            72            73           
 72
BM_format_to_back_inserter<std::string>/string_view len = 60                    
    +0.0001         +0.0026            73            73            73           
 73
BM_format_to_back_inserter<std::vector<char>>/string_view len = 60              
    -0.0090         -0.0066            83            82            82           
 82
BM_format_to_back_inserter<std::deque<char>>/string_view len = 60               
    +0.0097         +0.0126           280           283           280           
283
BM_format_to_back_inserter<std::list<char>>/string_view len = 60                
    +0.0011         +0.0036          1176          1177          1173          
1177
BM_format_to_iterator/<std::array> string_view len = 60                         
    +0.0001         +0.0026            44            44            44           
 44
BM_format_to_iterator/<std::string> string_view len = 60                        
    +0.0083         +0.0107            45            45            45           
 45
BM_format_to_iterator/<std::vector> string_view len = 60                        
    +0.0068         +0.0093            45            45            45           
 45
BM_format_to_iterator/<std::deque> string_view len = 60                         
    -0.0038         -0.0014            50            50            50           
 50
BM_sprintf/C string len = 6000                                                  
    +2.0230         +2.0305           114           344           114           
344
BM_format/C string len = 6000                                                   
    -0.9169         -0.9167         11792           980         11763           
980
BM_format_to_back_inserter<std::string>/C string len = 6000                     
    -0.9169         -0.9166         11778           979         11746           
979
BM_format_to_back_inserter<std::vector<char>>/C string len = 6000               
    -0.9194         -0.9192         11715           944         11686           
944
BM_format_to_back_inserter<std::deque<char>>/C string len = 6000                
    -0.4143         -0.4129         25464         14916         25403         
14915
BM_format_to_back_inserter<std::list<char>>/C string len = 6000                 
    -0.0901         -0.0878        126044        114686        125726        
114688
BM_format_to_iterator/<std::array> C string len = 6000                          
    -0.9852         -0.9852         10792           159         10766           
159
BM_format_to_iterator/<std::string> C string len = 6000                         
    -0.9852         -0.9852         10791           159         10761           
159
BM_format_to_iterator/<std::vector> C string len = 6000                         
    -0.9852         -0.9852         10775           159         10750           
159
BM_format_to_iterator/<std::deque> C string len = 6000                          
    -0.9611         -0.9610         11242           437         11215           
437
BM_format/string len = 6000                                                     
    +0.0108         +0.0133           919           929           917           
929
BM_format_to_back_inserter<std::string>/string len = 6000                       
    +0.0138         +0.0167           920           933           917           
933
BM_format_to_back_inserter<std::vector<char>>/string len = 6000                 
    +0.0041         +0.0064           888           892           886           
892
BM_format_to_back_inserter<std::deque<char>>/string len = 6000                  
    -0.0107         -0.0082         14999         14840         14963         
14839
BM_format_to_back_inserter<std::list<char>>/string len = 6000                   
    +0.0038         +0.0064        114504        114940        114213        
114942
BM_format_to_iterator/<std::array> string len = 6000                            
    +0.2011         +0.2040           120           144           120           
144
BM_format_to_iterator/<std::string> string len = 6000                           
    +0.0032         +0.0057           106           106           106           
106
BM_format_to_iterator/<std::vector> string len = 6000                           
    +0.0057         +0.0085           106           107           106           
107
BM_format_to_iterator/<std::deque> string len = 6000                            
    +0.0011         +0.0036           367           368           366           
368
BM_format/string_view len = 6000                                                
    +0.0105         +0.0130           910           919           907           
919
BM_format_to_back_inserter<std::string>/string_view len = 6000                  
    +0.0057         +0.0081           911           917           909           
917
BM_format_to_back_inserter<std::vector<char>>/string_view len = 6000            
    +0.0023         +0.0050           878           880           876           
880
BM_format_to_back_inserter<std::deque<char>>/string_view len = 6000             
    -0.0118         -0.0094         15031         14854         14994         
14853
BM_format_to_back_inserter<std::list<char>>/string_view len = 6000              
    +0.0040         +0.0065        114510        114963        114219        
114967
BM_format_to_iterator/<std::array> string_view len = 6000                       
    -0.0299         -0.0275           121           117           120           
117
BM_format_to_iterator/<std::string> string_view len = 6000                      
    +0.0062         +0.0086           116           116           115           
116
BM_format_to_iterator/<std::vector> string_view len = 6000                      
    +0.0034         +0.0062           115           116           115           
116
BM_format_to_iterator/<std::deque> string_view len = 6000                       
    +0.0011         +0.0035           351           351           350           
351
OVERALL_GEOMEAN                                                                 
    -0.2959         -0.2941             0             0             0           
  0
---
 libcxx/include/__format/formatter_string.h | 32 +++++-----------------
 1 file changed, 7 insertions(+), 25 deletions(-)

diff --git a/libcxx/include/__format/formatter_string.h 
b/libcxx/include/__format/formatter_string.h
index dee2b3ad073a5..a30e563992ece 100644
--- a/libcxx/include/__format/formatter_string.h
+++ b/libcxx/include/__format/formatter_string.h
@@ -64,32 +64,14 @@ struct _LIBCPP_TEMPLATE_VIS formatter<const _CharT*, 
_CharT> : public __formatte
   template <class _FormatContext>
   _LIBCPP_HIDE_FROM_ABI typename _FormatContext::iterator format(const _CharT* 
__str, _FormatContext& __ctx) const {
     _LIBCPP_ASSERT_INTERNAL(__str, "The basic_format_arg constructor should 
have prevented an invalid pointer.");
-
-    __format_spec::__parsed_specifications<_CharT> __specs = 
_Base::__parser_.__get_parsed_std_specifications(__ctx);
-#  if _LIBCPP_STD_VER >= 23
-    if (_Base::__parser_.__type_ == __format_spec::__type::__debug)
-      return 
__formatter::__format_escaped_string(basic_string_view<_CharT>{__str}, 
__ctx.out(), __specs);
-#  endif
-
-    // When using a center or right alignment and the width option the length
-    // of __str must be known to add the padding upfront. This case is handled
-    // by the base class by converting the argument to a basic_string_view.
+    // Converting the input to a basic_string_view means the data is looped 
over twice;
+    // - once to determine the lenght, and
+    // - once to process the data.
     //
-    // When using left alignment and the width option the padding is added
-    // after outputting __str so the length can be determined while outputting
-    // __str. The same holds true for the precision, during outputting __str it
-    // can be validated whether the precision threshold has been reached. For
-    // now these optimizations aren't implemented. Instead the base class
-    // handles these options.
-    // TODO FMT Implement these improvements.
-    if (__specs.__has_width() || __specs.__has_precision())
-      return __formatter::__write_string(basic_string_view<_CharT>{__str}, 
__ctx.out(), __specs);
-
-    // No formatting required, copy the string to the output.
-    auto __out_it = __ctx.out();
-    while (*__str)
-      *__out_it++ = *__str++;
-    return __out_it;
+    // This sounds slower than writing the output directly. However internally
+    // the output algorithms have optimizations for "bulk" operations. This
+    // means processing the data twice is faster than processing it once.
+    return _Base::format(basic_string_view<_CharT>(__str), __ctx);
   }
 };
 

_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to