llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Mark de Wever (mordante)

<details>
<summary>Changes</summary>

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&lt;std::list&lt;_CharT&gt;&gt; are 
not as great as the others; it just gets as slow as 
basic_string_view&lt;_CharT&gt;.

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&lt;std::string&gt;/C string len = 6                  
 53.0 ns         52.8 ns     13262680
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 6      
       69.7 ns         69.6 ns     10045636
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 6       
        148 ns          148 ns      4729368
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 6        
        127 ns          126 ns      5538441
BM_format_to_iterator/&lt;std::array&gt; C string len = 6                       
 42.9 ns         42.8 ns     16367158
BM_format_to_iterator/&lt;std::string&gt; C string len = 6                      
 43.5 ns         43.4 ns     16141644
BM_format_to_iterator/&lt;std::vector&gt; C string len = 6                      
 42.9 ns         42.8 ns     16366718
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string len = 6                    
 55.4 ns         55.2 ns     12660731
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 6        
       70.7 ns         70.5 ns      9927313
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 6         
        153 ns          153 ns      4573936
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 6          
        128 ns          128 ns      5486033
BM_format_to_iterator/&lt;std::array&gt; string len = 6                         
 44.6 ns         44.5 ns     15758122
BM_format_to_iterator/&lt;std::string&gt; string len = 6                        
 44.7 ns         44.6 ns     15690226
BM_format_to_iterator/&lt;std::vector&gt; string len = 6                        
 44.3 ns         44.2 ns     15715898
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string_view len = 6               
 54.3 ns         54.1 ns     12929219
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 6   
       70.0 ns         69.8 ns     10022355
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 6    
        153 ns          152 ns      4585749
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 6     
        128 ns          128 ns      5489760
BM_format_to_iterator/&lt;std::array&gt; string_view len = 6                    
 44.2 ns         44.1 ns     15884839
BM_format_to_iterator/&lt;std::string&gt; string_view len = 6                   
 44.8 ns         44.6 ns     15664278
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 6                   
 44.7 ns         44.6 ns     15716983
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/C string len = 60                 
  167 ns          167 ns      4203915
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 60     
        177 ns          176 ns      3965619
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 60      
        383 ns          382 ns      1832531
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 60       
       1270 ns         1267 ns       552686
BM_format_to_iterator/&lt;std::array&gt; C string len = 60                      
  141 ns          140 ns      4988441
BM_format_to_iterator/&lt;std::string&gt; C string len = 60                     
  141 ns          141 ns      4956101
BM_format_to_iterator/&lt;std::vector&gt; C string len = 60                     
  141 ns          141 ns      4963443
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string len = 60                   
 73.2 ns         73.0 ns      9524524
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 60       
       81.6 ns         81.4 ns      8584033
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 60        
        279 ns          279 ns      2515146
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 60         
       1177 ns         1174 ns       597172
BM_format_to_iterator/&lt;std::array&gt; string len = 60                        
 44.5 ns         44.4 ns     15753131
BM_format_to_iterator/&lt;std::string&gt; string len = 60                       
 44.7 ns         44.6 ns     15692630
BM_format_to_iterator/&lt;std::vector&gt; string len = 60                       
 44.8 ns         44.7 ns     15664689
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string_view len = 60              
 72.7 ns         72.6 ns      9638209
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 60  
       82.6 ns         82.4 ns      8496602
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 60   
        280 ns          280 ns      2508982
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 60    
       1176 ns         1173 ns       597714
BM_format_to_iterator/&lt;std::array&gt; string_view len = 60                   
 44.2 ns         44.1 ns     15896934
BM_format_to_iterator/&lt;std::string&gt; string_view len = 60                  
 44.7 ns         44.6 ns     15695427
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 60                  
 44.7 ns         44.6 ns     15680899
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/C string len = 6000               
11778 ns        11746 ns        59572
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 6000   
      11715 ns        11686 ns        60053
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 6000    
      25464 ns        25403 ns        27538
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 6000     
     126044 ns       125726 ns         5572
BM_format_to_iterator/&lt;std::array&gt; C string len = 6000                    
10792 ns        10766 ns        64943
BM_format_to_iterator/&lt;std::string&gt; C string len = 6000                   
10791 ns        10761 ns        64918
BM_format_to_iterator/&lt;std::vector&gt; C string len = 6000                   
10775 ns        10750 ns        65149
BM_format_to_iterator/&lt;std::deque&gt; C string len = 6000                    
11242 ns        11215 ns        62542
BM_format/string len = 6000                                                 919 
ns          917 ns       763961
BM_format_to_back_inserter&lt;std::string&gt;/string len = 6000                 
  920 ns          917 ns       763094
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 6000     
        888 ns          886 ns       793468
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 6000      
      14999 ns        14963 ns        46758
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 6000       
     114504 ns       114213 ns         6130
BM_format_to_iterator/&lt;std::array&gt; string len = 6000                      
  120 ns          120 ns      5823426
BM_format_to_iterator/&lt;std::string&gt; string len = 6000                     
  106 ns          106 ns      6609299
BM_format_to_iterator/&lt;std::vector&gt; string len = 6000                     
  106 ns          106 ns      6613867
BM_format_to_iterator/&lt;std::deque&gt; string len = 6000                      
  367 ns          366 ns      1912818
BM_format/string_view len = 6000                                            910 
ns          907 ns       771491
BM_format_to_back_inserter&lt;std::string&gt;/string_view len = 6000            
  911 ns          909 ns       770065
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 
6000        878 ns          876 ns       794976
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 6000 
      15031 ns        14994 ns        46651
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 6000  
     114510 ns       114219 ns         6130
BM_format_to_iterator/&lt;std::array&gt; string_view len = 6000                 
  121 ns          120 ns      5814249
BM_format_to_iterator/&lt;std::string&gt; string_view len = 6000                
  116 ns          115 ns      6072315
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 6000                
  115 ns          115 ns      6095762
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/C string len = 6                  
 55.1 ns         55.1 ns     12691642
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 6      
       71.2 ns         71.3 ns      9819560
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 6       
        154 ns          154 ns      4548709
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 6        
        131 ns          131 ns      5338318
BM_format_to_iterator/&lt;std::array&gt; C string len = 6                       
 45.0 ns         45.0 ns     15569429
BM_format_to_iterator/&lt;std::string&gt; C string len = 6                      
 45.9 ns         45.9 ns     15240594
BM_format_to_iterator/&lt;std::vector&gt; C string len = 6                      
 44.4 ns         44.4 ns     15768343
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string len = 6                    
 55.4 ns         55.4 ns     12634483
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 6        
       70.4 ns         70.4 ns      9948288
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 6         
        154 ns          154 ns      4531741
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 6          
        132 ns          132 ns      5289798
BM_format_to_iterator/&lt;std::array&gt; string len = 6                         
 44.5 ns         44.5 ns     15743437
BM_format_to_iterator/&lt;std::string&gt; string len = 6                        
 44.9 ns         44.9 ns     15591961
BM_format_to_iterator/&lt;std::vector&gt; string len = 6                        
 45.0 ns         45.0 ns     15541308
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string_view len = 6               
 54.6 ns         54.6 ns     12818233
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 6   
       69.9 ns         69.9 ns     10018025
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 6    
        154 ns          154 ns      4534215
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 6     
        131 ns          131 ns      5337938
BM_format_to_iterator/&lt;std::array&gt; string_view len = 6                    
 44.2 ns         44.2 ns     15854695
BM_format_to_iterator/&lt;std::string&gt; string_view len = 6                   
 45.0 ns         45.0 ns     15551054
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 6                   
 45.0 ns         45.0 ns     15567905
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/C string len = 60                 
 73.7 ns         73.7 ns      9492371
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 60     
       83.1 ns         83.1 ns      8399017
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 60      
        284 ns          284 ns      2466510
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 60       
       1177 ns         1177 ns       592514
BM_format_to_iterator/&lt;std::array&gt; C string len = 60                      
 44.9 ns         44.9 ns     15558172
BM_format_to_iterator/&lt;std::string&gt; C string len = 60                     
 45.8 ns         45.8 ns     15283103
BM_format_to_iterator/&lt;std::vector&gt; C string len = 60                     
 44.6 ns         44.6 ns     15678967
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string len = 60                   
 72.0 ns         72.1 ns      9695746
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 60       
       82.3 ns         82.3 ns      8509528
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 60        
        279 ns          279 ns      2506108
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 60         
       1180 ns         1180 ns       592963
BM_format_to_iterator/&lt;std::array&gt; string len = 60                        
 44.7 ns         44.7 ns     15657865
BM_format_to_iterator/&lt;std::string&gt; string len = 60                       
 45.0 ns         45.0 ns     15569049
BM_format_to_iterator/&lt;std::vector&gt; string len = 60                       
 44.9 ns         44.9 ns     15576187
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string_view len = 60              
 72.8 ns         72.8 ns      9638941
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 60  
       81.9 ns         81.9 ns      8529931
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 60   
        283 ns          283 ns      2471522
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 60    
       1177 ns         1177 ns       594752
BM_format_to_iterator/&lt;std::array&gt; string_view len = 60                   
 44.2 ns         44.2 ns     15841413
BM_format_to_iterator/&lt;std::string&gt; string_view len = 60                  
 45.1 ns         45.1 ns     15546279
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 60                  
 45.0 ns         45.0 ns     15555756
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/C string len = 6000               
  979 ns          979 ns       709571
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 6000   
        944 ns          944 ns       744518
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 6000    
      14916 ns        14915 ns        46875
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 6000     
     114686 ns       114688 ns         6110
BM_format_to_iterator/&lt;std::array&gt; C string len = 6000                    
  159 ns          159 ns      4394506
BM_format_to_iterator/&lt;std::string&gt; C string len = 6000                   
  159 ns          159 ns      4384577
BM_format_to_iterator/&lt;std::vector&gt; C string len = 6000                   
  159 ns          159 ns      4393225
BM_format_to_iterator/&lt;std::deque&gt; C string len = 6000                    
  437 ns          437 ns      1601253
BM_format/string len = 6000                                                 929 
ns          929 ns       751889
BM_format_to_back_inserter&lt;std::string&gt;/string len = 6000                 
  933 ns          933 ns       752042
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 6000     
        892 ns          892 ns       785064
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 6000      
      14840 ns        14839 ns        47177
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 6000       
     114940 ns       114942 ns         6095
BM_format_to_iterator/&lt;std::array&gt; string len = 6000                      
  144 ns          144 ns      4859849
BM_format_to_iterator/&lt;std::string&gt; string len = 6000                     
  106 ns          106 ns      6565564
BM_format_to_iterator/&lt;std::vector&gt; string len = 6000                     
  107 ns          107 ns      6584152
BM_format_to_iterator/&lt;std::deque&gt; string len = 6000                      
  368 ns          368 ns      1904727
BM_format/string_view len = 6000                                            919 
ns          919 ns       760401
BM_format_to_back_inserter&lt;std::string&gt;/string_view len = 6000            
  917 ns          917 ns       760934
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 
6000        880 ns          880 ns       796244
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 6000 
      14854 ns        14853 ns        47101
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 6000  
     114963 ns       114967 ns         6086
BM_format_to_iterator/&lt;std::array&gt; string_view len = 6000                 
  117 ns          117 ns      5974080
BM_format_to_iterator/&lt;std::string&gt; string_view len = 6000                
  116 ns          116 ns      6016080
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 6000                
  116 ns          116 ns      6053780
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/C string len = 6                  
          +0.0395         +0.0424            53            55            53     
       55
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 6      
                +0.0220         +0.0244            70            71            
70            71
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 6       
                +0.0399         +0.0424           148           154           
148           154
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 6        
                +0.0339         +0.0365           127           131           
126           131
BM_format_to_iterator/&lt;std::array&gt; C string len = 6                       
          +0.0494         +0.0520            43            45            43     
       45
BM_format_to_iterator/&lt;std::string&gt; C string len = 6                      
          +0.0539         +0.0568            44            46            43     
       46
BM_format_to_iterator/&lt;std::vector&gt; C string len = 6                      
          +0.0359         +0.0384            43            44            43     
       44
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string len = 6                    
          +0.0008         +0.0036            55            55            55     
       55
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 6        
                -0.0046         -0.0021            71            70            
71            70
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 6         
                +0.0066         +0.0091           153           154           
153           154
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 6          
                +0.0291         +0.0316           128           132           
128           132
BM_format_to_iterator/&lt;std::array&gt; string len = 6                         
          -0.0030         -0.0006            45            44            44     
       44
BM_format_to_iterator/&lt;std::string&gt; string len = 6                        
          +0.0045         +0.0069            45            45            45     
       45
BM_format_to_iterator/&lt;std::vector&gt; string len = 6                        
          +0.0150         +0.0177            44            45            44     
       45
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string_view len = 6               
          +0.0052         +0.0081            54            55            54     
       55
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 6   
                -0.0017         +0.0008            70            70            
70            70
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 6    
                +0.0113         +0.0137           153           154           
152           154
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 6     
                +0.0260         +0.0286           128           131           
128           131
BM_format_to_iterator/&lt;std::array&gt; string_view len = 6                    
          -0.0006         +0.0021            44            44            44     
       44
BM_format_to_iterator/&lt;std::string&gt; string_view len = 6                   
          +0.0059         +0.0084            45            45            45     
       45
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 6                   
          +0.0083         +0.0108            45            45            45     
       45
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/C string len = 60                 
          -0.5592         -0.5582           167            74           167     
       74
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 60     
                -0.5294         -0.5282           177            83           
176            83
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 60      
                -0.2591         -0.2570           383           284           
382           284
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 60       
                -0.0730         -0.0707          1270          1177          
1267          1177
BM_format_to_iterator/&lt;std::array&gt; C string len = 60                      
          -0.6804         -0.6797           141            45           140     
       45
BM_format_to_iterator/&lt;std::string&gt; C string len = 60                     
          -0.6759         -0.6750           141            46           141     
       46
BM_format_to_iterator/&lt;std::vector&gt; C string len = 60                     
          -0.6849         -0.6841           141            45           141     
       45
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string len = 60                   
          -0.0151         -0.0127            73            72            73     
       72
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 60       
                +0.0093         +0.0118            82            82            
81            82
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 60        
                -0.0003         +0.0023           279           279           
279           279
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 60         
                +0.0025         +0.0050          1177          1180          
1174          1180
BM_format_to_iterator/&lt;std::array&gt; string len = 60                        
          +0.0046         +0.0070            45            45            44     
       45
BM_format_to_iterator/&lt;std::string&gt; string len = 60                       
          +0.0050         +0.0075            45            45            45     
       45
BM_format_to_iterator/&lt;std::vector&gt; string len = 60                       
          +0.0025         +0.0051            45            45            45     
       45
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string_view len = 60              
          +0.0001         +0.0026            73            73            73     
       73
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 60  
                -0.0090         -0.0066            83            82            
82            82
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 60   
                +0.0097         +0.0126           280           283           
280           283
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 60    
                +0.0011         +0.0036          1176          1177          
1173          1177
BM_format_to_iterator/&lt;std::array&gt; string_view len = 60                   
          +0.0001         +0.0026            44            44            44     
       44
BM_format_to_iterator/&lt;std::string&gt; string_view len = 60                  
          +0.0083         +0.0107            45            45            45     
       45
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 60                  
          +0.0068         +0.0093            45            45            45     
       45
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/C string len = 6000               
          -0.9169         -0.9166         11778           979         11746     
      979
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/C string len = 6000   
                -0.9194         -0.9192         11715           944         
11686           944
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/C string len = 6000    
                -0.4143         -0.4129         25464         14916         
25403         14915
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/C string len = 6000     
                -0.0901         -0.0878        126044        114686        
125726        114688
BM_format_to_iterator/&lt;std::array&gt; C string len = 6000                    
          -0.9852         -0.9852         10792           159         10766     
      159
BM_format_to_iterator/&lt;std::string&gt; C string len = 6000                   
          -0.9852         -0.9852         10791           159         10761     
      159
BM_format_to_iterator/&lt;std::vector&gt; C string len = 6000                   
          -0.9852         -0.9852         10775           159         10750     
      159
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string len = 6000                 
          +0.0138         +0.0167           920           933           917     
      933
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string len = 6000     
                +0.0041         +0.0064           888           892           
886           892
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string len = 6000      
                -0.0107         -0.0082         14999         14840         
14963         14839
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string len = 6000       
                +0.0038         +0.0064        114504        114940        
114213        114942
BM_format_to_iterator/&lt;std::array&gt; string len = 6000                      
          +0.2011         +0.2040           120           144           120     
      144
BM_format_to_iterator/&lt;std::string&gt; string len = 6000                     
          +0.0032         +0.0057           106           106           106     
      106
BM_format_to_iterator/&lt;std::vector&gt; string len = 6000                     
          +0.0057         +0.0085           106           107           106     
      107
BM_format_to_iterator/&lt;std::deque&gt; 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&lt;std::string&gt;/string_view len = 6000            
          +0.0057         +0.0081           911           917           909     
      917
BM_format_to_back_inserter&lt;std::vector&lt;char&gt;&gt;/string_view len = 
6000                +0.0023         +0.0050           878           880         
  876           880
BM_format_to_back_inserter&lt;std::deque&lt;char&gt;&gt;/string_view len = 6000 
                -0.0118         -0.0094         15031         14854         
14994         14853
BM_format_to_back_inserter&lt;std::list&lt;char&gt;&gt;/string_view len = 6000  
                +0.0040         +0.0065        114510        114963        
114219        114967
BM_format_to_iterator/&lt;std::array&gt; string_view len = 6000                 
          -0.0299         -0.0275           121           117           120     
      117
BM_format_to_iterator/&lt;std::string&gt; string_view len = 6000                
          +0.0062         +0.0086           116           116           115     
      116
BM_format_to_iterator/&lt;std::vector&gt; string_view len = 6000                
          +0.0034         +0.0062           115           116           115     
      116
BM_format_to_iterator/&lt;std::deque&gt; string_view len = 6000                 
          +0.0011         +0.0035           351           351           350     
      351
OVERALL_GEOMEAN                                                                 
    -0.2959         -0.2941             0             0             0           
  0

---
Full diff: https://github.com/llvm/llvm-project/pull/101805.diff


1 Files Affected:

- (modified) libcxx/include/__format/formatter_string.h (+7-25) 


``````````diff
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);
   }
 };
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/101805
_______________________________________________
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