Skip to content

Conversation

@mordante
Copy link
Member

@mordante mordante commented Aug 3, 2024

__format_to_n_buffer is not used in the public library interface so the changes are not an ABI break.

Before
Benchmark Time CPU Time Old Time New CPU Old CPU New

BM_format_to_n_string_back_inserterstd::string/1 -0.0160 -0.0136 59 58 59 58
BM_format_to_n_string_back_inserterstd::string/2 +0.0020 +0.0044 58 59 58 59
BM_format_to_n_string_back_inserterstd::string/4 +0.0084 +0.0109 58 59 58 59
BM_format_to_n_string_back_inserterstd::string/8 -0.0014 +0.0014 59 59 58 59
BM_format_to_n_string_back_inserterstd::string/16 -0.0042 -0.0018 59 58 59 58
BM_format_to_n_string_back_inserterstd::string/32 -0.0136 -0.0112 78 77 78 77
BM_format_to_n_string_back_inserterstd::string/64 -0.0096 -0.0072 78 77 77 77
BM_format_to_n_string_back_inserterstd::string/128 -0.1486 -0.1465 91 77 91 77
BM_format_to_n_string_back_inserterstd::string/256 -0.1215 -0.1191 102 90 102 90
BM_format_to_n_string_back_inserterstd::string/512 -0.1412 -0.1391 158 136 158 136
BM_format_to_n_string_back_inserterstd::string/1024 -0.1135 -0.1114 290 257 289 257
BM_format_to_n_string_back_inserterstd::string/2048 -0.1551 -0.1530 489 413 488 413
BM_format_to_n_string_back_inserterstd::string/4096 -0.1665 -0.1642 801 668 799 668
BM_format_to_n_string_back_inserterstd::string/8192 -0.2301 -0.2282 1449 1116 1445 1116
BM_format_to_n_string_back_inserterstd::string/16384 -0.1988 -0.1965 2942 2357 2933 2357
BM_format_to_n_string_back_inserterstd::string/32768 -0.2129 -0.2109 5676 4467 5661 4467
BM_format_to_n_string_back_inserterstd::string/65536 -0.2469 -0.2449 12437 9366 12404 9366
BM_format_to_n_string_back_inserterstd::string/131072 -0.2294 -0.2274 25855 19923 25787 19923
BM_format_to_n_string_back_inserterstd::string/262144 -0.1906 -0.1885 52880 42798 52739 42798
BM_format_to_n_string_back_inserterstd::string/524288 -0.1898 -0.1876 107703 87261 107410 87257
BM_format_to_n_string_back_inserterstd::string/1048576 -0.2162 -0.2139 231479 181427 230781 181426
BM_format_to_n_string_back_inserter<std::vector>/1 -0.0035 -0.0007 72 72 72 72
BM_format_to_n_string_back_inserter<std::vector>/2 +0.0104 +0.0128 73 73 72 73
BM_format_to_n_string_back_inserter<std::vector>/4 -0.0022 +0.0003 74 74 74 74
BM_format_to_n_string_back_inserter<std::vector>/8 +0.0092 +0.0116 75 76 75 76
BM_format_to_n_string_back_inserter<std::vector>/16 -0.0019 +0.0005 79 79 79 79
BM_format_to_n_string_back_inserter<std::vector>/32 +0.0168 +0.0195 89 90 88 90
BM_format_to_n_string_back_inserter<std::vector>/64 -0.0077 -0.0054 91 90 90 90
BM_format_to_n_string_back_inserter<std::vector>/128 -0.1628 -0.1608 109 91 109 91
BM_format_to_n_string_back_inserter<std::vector>/256 -0.0994 -0.0971 120 108 119 108
BM_format_to_n_string_back_inserter<std::vector>/512 -0.1116 -0.1095 186 165 186 165
BM_format_to_n_string_back_inserter<std::vector>/1024 -0.1168 -0.1144 284 250 283 250
BM_format_to_n_string_back_inserter<std::vector>/2048 -0.1664 -0.1644 484 404 483 404
BM_format_to_n_string_back_inserter<std::vector>/4096 -0.2161 -0.2143 802 629 800 629
BM_format_to_n_string_back_inserter<std::vector>/8192 -0.2834 -0.2817 1469 1053 1466 1053
BM_format_to_n_string_back_inserter<std::vector>/16384 -0.2365 -0.2344 2700 2062 2693 2062
BM_format_to_n_string_back_inserter<std::vector>/32768 -0.2359 -0.2341 4979 3805 4967 3805
BM_format_to_n_string_back_inserter<std::vector>/65536 -0.2754 -0.2736 10431 7558 10405 7558
BM_format_to_n_string_back_inserter<std::vector>/131072 -0.2505 -0.2487 22646 16973 22591 16973
BM_format_to_n_string_back_inserter<std::vector>/262144 -0.1981 -0.1958 46278 37110 46148 37111
BM_format_to_n_string_back_inserter<std::vector>/524288 -0.2027 -0.2011 91695 73110 91511 73108
BM_format_to_n_string_back_inserter<std::vector>/1048576 -0.2367 -0.2348 195458 149194 194988 149197
BM_format_to_n_string_back_inserter<std::list>/1 +0.0045 +0.0068 66 66 65 66
BM_format_to_n_string_back_inserter<std::list>/2 +0.0068 +0.0092 79 79 79 79
BM_format_to_n_string_back_inserter<std::list>/4 -0.0026 +0.0001 107 107 107 107
BM_format_to_n_string_back_inserter<std::list>/8 +0.0498 +0.0523 171 180 171 180
BM_format_to_n_string_back_inserter<std::list>/16 +0.0100 +0.0124 331 334 330 334
BM_format_to_n_string_back_inserter<std::list>/32 +0.0320 +0.0345 641 662 640 662
BM_format_to_n_string_back_inserter<std::list>/64 +0.0242 +0.0270 1237 1267 1233 1267
BM_format_to_n_string_back_inserter<std::list>/128 +0.0025 +0.0047 2474 2480 2469 2480
BM_format_to_n_string_back_inserter<std::list>/256 -0.0122 -0.0098 4984 4923 4972 4924
BM_format_to_n_string_back_inserter<std::list>/512 +0.0074 +0.0098 9740 9812 9716 9811
BM_format_to_n_string_back_inserter<std::list>/1024 +0.0045 +0.0072 19503 19590 19451 19591
BM_format_to_n_string_back_inserter<std::list>/2048 +0.0021 +0.0046 39078 39161 38981 39159
BM_format_to_n_string_back_inserter<std::list>/4096 -0.0002 +0.0023 78329 78316 78132 78315
BM_format_to_n_string_back_inserter<std::list>/8192 +0.0001 +0.0026 156689 156709 156291 156699
BM_format_to_n_string_back_inserter<std::list>/16384 -0.0025 +0.0004 313624 312842 312732 312842
BM_format_to_n_string_back_inserter<std::list>/32768 -0.0009 +0.0017 630336 629744 628711 629751
BM_format_to_n_string_back_inserter<std::list>/65536 -0.0029 -0.0001 1261542 1257851 1258055 1257872
BM_format_to_n_string_back_inserter<std::list>/131072 -0.0047 -0.0016 2543001 2531022 2535000 2530835
BM_format_to_n_string_back_inserter<std::list>/262144 -0.0061 -0.0017 5214390 5182786 5191608 5182661
BM_format_to_n_string_back_inserter<std::list>/524288 -0.0079 -0.0040 10650366 10566644 10609616 10566709
BM_format_to_n_string_back_inserter<std::list>/1048576 -0.0165 -0.0108 21677130 21319849 21550764 21318080
BM_format_to_n_string_beginstd::string/1 -0.0931 -0.0909 54 49 54 49
BM_format_to_n_string_beginstd::string/2 -0.0861 -0.0839 53 48 53 48
BM_format_to_n_string_beginstd::string/4 -0.0872 -0.0847 53 49 53 49
BM_format_to_n_string_beginstd::string/8 -0.0963 -0.0939 54 48 54 48
BM_format_to_n_string_beginstd::string/16 -0.0969 -0.0947 54 48 54 48
BM_format_to_n_string_beginstd::string/32 -0.1108 -0.1086 54 48 54 48
BM_format_to_n_string_beginstd::string/64 -0.1107 -0.1086 54 48 54 48
BM_format_to_n_string_beginstd::string/128 -0.2054 -0.2036 61 48 61 48
BM_format_to_n_string_beginstd::string/256 -0.2768 -0.2751 69 50 69 50
BM_format_to_n_string_beginstd::string/512 -0.4127 -0.4112 90 53 89 53
BM_format_to_n_string_beginstd::string/1024 -0.5743 -0.5734 132 56 132 56
BM_format_to_n_string_beginstd::string/2048 -0.7063 -0.7056 229 67 228 67
BM_format_to_n_string_beginstd::string/4096 -0.7617 -0.7611 425 101 424 101
BM_format_to_n_string_beginstd::string/8192 -0.8153 -0.8148 812 150 810 150
BM_format_to_n_string_beginstd::string/16384 -0.8140 -0.8136 1656 308 1652 308
BM_format_to_n_string_beginstd::string/32768 -0.5789 -0.5779 3179 1339 3171 1339
BM_format_to_n_string_beginstd::string/65536 -0.5170 -0.5158 6818 3293 6802 3293
BM_format_to_n_string_beginstd::string/131072 -0.5552 -0.5539 14829 6596 14788 6596
BM_format_to_n_string_beginstd::string/262144 -0.5240 -0.5228 29547 14064 29471 14065
BM_format_to_n_string_beginstd::string/524288 -0.5049 -0.5036 59436 29428 59284 29428
BM_format_to_n_string_beginstd::string/1048576 -0.5123 -0.5110 120292 58666 119974 58666
BM_format_to_n_string_begin<std::vector>/1 -0.0947 -0.0925 53 48 53 48
BM_format_to_n_string_begin<std::vector>/2 -0.0859 -0.0834 53 48 53 48
BM_format_to_n_string_begin<std::vector>/4 -0.0913 -0.0892 53 48 53 48
BM_format_to_n_string_begin<std::vector>/8 -0.0808 -0.0786 52 48 52 48
BM_format_to_n_string_begin<std::vector>/16 -0.0808 -0.0786 53 48 53 48
BM_format_to_n_string_begin<std::vector>/32 -0.0921 -0.0899 53 48 53 48
BM_format_to_n_string_begin<std::vector>/64 -0.0918 -0.0897 53 48 53 48
BM_format_to_n_string_begin<std::vector>/128 -0.1769 -0.1747 59 48 59 48
BM_format_to_n_string_begin<std::vector>/256 -0.3249 -0.3233 73 49 73 49
BM_format_to_n_string_begin<std::vector>/512 -0.4552 -0.4539 97 53 96 53
BM_format_to_n_string_begin<std::vector>/1024 -0.5978 -0.5969 138 56 138 56
BM_format_to_n_string_begin<std::vector>/2048 -0.7152 -0.7144 235 67 235 67
BM_format_to_n_string_begin<std::vector>/4096 -0.7780 -0.7775 439 98 438 98
BM_format_to_n_string_begin<std::vector>/8192 -0.8230 -0.8226 853 151 851 151
BM_format_to_n_string_begin<std::vector>/16384 -0.8065 -0.8060 1627 315 1623 315
BM_format_to_n_string_begin<std::vector>/32768 -0.5823 -0.5811 3221 1345 3212 1345
BM_format_to_n_string_begin<std::vector>/65536 -0.5351 -0.5340 7089 3295 7072 3295
BM_format_to_n_string_begin<std::vector>/131072 -0.5683 -0.5672 15268 6591 15229 6590
BM_format_to_n_string_begin<std::vector>/262144 -0.5351 -0.5339 30296 14084 30219 14084
BM_format_to_n_string_begin<std::vector>/524288 -0.5061 -0.5049 61230 30239 61074 30238
BM_format_to_n_string_begin<std::vector>/1048576 -0.5143 -0.5128 124101 60270 123704 60271
BM_format_to_n_string_begin<std::list>/1 +0.0383 +0.0408 49 51 49 51
BM_format_to_n_string_begin<std::list>/2 +0.0278 +0.0301 50 51 50 51
BM_format_to_n_string_begin<std::list>/4 +0.0388 +0.0412 51 53 51 53
BM_format_to_n_string_begin<std::list>/8 -0.0386 -0.0360 64 62 64 62
BM_format_to_n_string_begin<std::list>/16 -0.0225 -0.0201 85 83 85 83
BM_format_to_n_string_begin<std::list>/32 -0.0095 -0.0071 127 126 127 126
BM_format_to_n_string_begin<std::list>/64 -0.0072 -0.0048 214 212 213 212
BM_format_to_n_string_begin<std::list>/128 -0.0117 -0.0092 389 385 388 385
BM_format_to_n_string_begin<std::list>/256 -0.0034 -0.0009 749 746 747 746
BM_format_to_n_string_begin<std::list>/512 -0.0098 -0.0074 1453 1439 1449 1439
BM_format_to_n_string_begin<std::list>/1024 +0.0109 +0.0132 2852 2883 2845 2882
BM_format_to_n_string_begin<std::list>/2048 +0.0088 +0.0113 5685 5735 5671 5735
BM_format_to_n_string_begin<std::list>/4096 +0.0043 +0.0068 11312 11360 11283 11360
BM_format_to_n_string_begin<std::list>/8192 +0.0171 +0.0197 22644 23030 22586 23030
BM_format_to_n_string_begin<std::list>/16384 +0.0146 +0.0172 45298 45959 45180 45958
BM_format_to_n_string_begin<std::list>/32768 +0.0167 +0.0195 90351 91864 90110 91864
BM_format_to_n_string_begin<std::list>/65536 +0.0150 +0.0180 180594 183305 180048 183298
BM_format_to_n_string_begin<std::list>/131072 +0.0060 +0.0092 373023 375274 371863 375279
BM_format_to_n_string_begin<std::list>/262144 -0.0354 -0.0318 895166 863452 891717 863366
BM_format_to_n_string_begin<std::list>/524288 -0.0745 -0.0712 2209006 2044442 2201104 2044356
BM_format_to_n_string_begin<std::list>/1048576 -0.0161 -0.0125 4421130 4349820 4404315 4349352
BM_format_to_n_string_span/1 -0.0987 -0.0965 53 48 53 48
BM_format_to_n_string_span/2 -0.0768 -0.0745 53 48 52 48
BM_format_to_n_string_span/4 -0.0904 -0.0882 53 48 53 48
BM_format_to_n_string_span/8 -0.0868 -0.0846 53 48 53 48
BM_format_to_n_string_span/16 -0.0957 -0.0932 54 49 54 49
BM_format_to_n_string_span/32 -0.0926 -0.0904 53 48 53 48
BM_format_to_n_string_span/64 -0.0923 -0.0876 53 48 53 48
BM_format_to_n_string_span/128 -0.1998 -0.1977 61 49 61 49
BM_format_to_n_string_span/256 -0.2900 -0.2883 69 49 69 49
BM_format_to_n_string_span/512 -0.4116 -0.4100 90 53 89 53
BM_format_to_n_string_span/1024 -0.5854 -0.5844 134 56 134 56
BM_format_to_n_string_span/2048 -0.7000 -0.6993 223 67 222 67
BM_format_to_n_string_span/4096 -0.7731 -0.7725 427 97 426 97
BM_format_to_n_string_span/8192 -0.8164 -0.8159 818 150 816 150
BM_format_to_n_string_span/16384 -0.3453 -0.3436 1622 1062 1617 1062
BM_format_to_n_string_span/32768 -0.5885 -0.5875 3137 1291 3129 1291
BM_format_to_n_string_span/65536 -0.5064 -0.5052 6698 3306 6682 3306
BM_format_to_n_string_span/131072 -0.5622 -0.5612 14925 6534 14888 6534
BM_format_to_n_string_span/262144 -0.5215 -0.5201 29688 14207 29603 14207
BM_format_to_n_string_span/524288 -0.4899 -0.4888 59308 30252 59180 30253
BM_format_to_n_string_span/1048576 -0.4927 -0.4913 118765 60247 118433 60248
BM_format_to_n_string_pointer/1 -0.0827 -0.0804 52 48 52 48
BM_format_to_n_string_pointer/2 -0.0843 -0.0821 53 48 53 48
BM_format_to_n_string_pointer/4 -0.0944 -0.0920 53 48 53 48
BM_format_to_n_string_pointer/8 -0.0875 -0.0853 53 48 53 48
BM_format_to_n_string_pointer/16 -0.0793 -0.0771 53 48 53 48
BM_format_to_n_string_pointer/32 -0.0767 -0.0743 52 48 52 48
BM_format_to_n_string_pointer/64 -0.0935 -0.0914 53 48 53 48
BM_format_to_n_string_pointer/128 -0.2203 -0.2182 62 49 62 49
BM_format_to_n_string_pointer/256 -0.2950 -0.2933 70 49 69 49
BM_format_to_n_string_pointer/512 -0.4038 -0.4025 88 53 88 53
BM_format_to_n_string_pointer/1024 -0.5755 -0.5745 131 56 131 56
BM_format_to_n_string_pointer/2048 -0.7043 -0.7036 226 67 225 67
BM_format_to_n_string_pointer/4096 -0.7726 -0.7719 426 97 425 97
BM_format_to_n_string_pointer/8192 -0.8157 -0.8153 815 150 813 150
BM_format_to_n_string_pointer/16384 -0.3490 -0.3473 1618 1053 1614 1053
BM_format_to_n_string_pointer/32768 -0.5880 -0.5870 3137 1293 3129 1292
BM_format_to_n_string_pointer/65536 -0.5062 -0.5048 6693 3305 6675 3305
BM_format_to_n_string_pointer/131072 -0.5617 -0.5606 14912 6536 14876 6536
BM_format_to_n_string_pointer/262144 -0.5206 -0.5194 29685 14230 29609 14230
BM_format_to_n_string_pointer/524288 -0.4884 -0.4873 59254 30316 59133 30315
BM_format_to_n_string_pointer/1048576 -0.4924 -0.4915 118746 60274 118523 60275

__format_to_n_buffer is not used in the public library interface so the
changes are not an ABI break.

Before
----------------------------------------------------------------------------------------------------------------------------
Benchmark                                                                  Time             CPU   Iterations UserCounters...
----------------------------------------------------------------------------------------------------------------------------
BM_format_to_n_string_back_inserter<std::string>/1                      59.2 ns         59.1 ns     11797400 bytes_per_second=16.146Mi/s
BM_format_to_n_string_back_inserter<std::string>/2                      58.5 ns         58.3 ns     12042693 bytes_per_second=32.69Mi/s
BM_format_to_n_string_back_inserter<std::string>/4                      58.2 ns         58.0 ns     12053679 bytes_per_second=65.7375Mi/s
BM_format_to_n_string_back_inserter<std::string>/8                      58.6 ns         58.4 ns     12000831 bytes_per_second=130.542Mi/s
BM_format_to_n_string_back_inserter<std::string>/16                     58.7 ns         58.6 ns     11948692 bytes_per_second=260.493Mi/s
BM_format_to_n_string_back_inserter<std::string>/32                     77.8 ns         77.6 ns      8957906 bytes_per_second=393.212Mi/s
BM_format_to_n_string_back_inserter<std::string>/64                     77.5 ns         77.3 ns      9015286 bytes_per_second=789.397Mi/s
BM_format_to_n_string_back_inserter<std::string>/128                    90.9 ns         90.7 ns      7712930 bytes_per_second=1.31409Gi/s
BM_format_to_n_string_back_inserter<std::string>/256                     102 ns          102 ns      6865771 bytes_per_second=2.33399Gi/s
BM_format_to_n_string_back_inserter<std::string>/512                     158 ns          158 ns      4449684 bytes_per_second=3.02418Gi/s
BM_format_to_n_string_back_inserter<std::string>/1024                    290 ns          289 ns      2415073 bytes_per_second=3.29623Gi/s
BM_format_to_n_string_back_inserter<std::string>/2048                    489 ns          488 ns      1435682 bytes_per_second=3.90789Gi/s
BM_format_to_n_string_back_inserter<std::string>/4096                    801 ns          799 ns       875722 bytes_per_second=4.77568Gi/s
BM_format_to_n_string_back_inserter<std::string>/8192                   1449 ns         1445 ns       485062 bytes_per_second=5.27805Gi/s
BM_format_to_n_string_back_inserter<std::string>/16384                  2942 ns         2933 ns       238811 bytes_per_second=5.20206Gi/s
BM_format_to_n_string_back_inserter<std::string>/32768                  5676 ns         5661 ns       123699 bytes_per_second=5.39051Gi/s
BM_format_to_n_string_back_inserter<std::string>/65536                 12437 ns        12404 ns        56488 bytes_per_second=4.92062Gi/s
BM_format_to_n_string_back_inserter<std::string>/131072                25855 ns        25787 ns        27203 bytes_per_second=4.73377Gi/s
BM_format_to_n_string_back_inserter<std::string>/262144                52880 ns        52739 ns        13234 bytes_per_second=4.62925Gi/s
BM_format_to_n_string_back_inserter<std::string>/524288               107703 ns       107410 ns         6509 bytes_per_second=4.54594Gi/s
BM_format_to_n_string_back_inserter<std::string>/1048576              231479 ns       230781 ns         3041 bytes_per_second=4.23155Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/1                72.2 ns         72.0 ns      9743767 bytes_per_second=13.2436Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/2                72.5 ns         72.3 ns      9678565 bytes_per_second=26.3647Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/4                74.1 ns         73.9 ns      9474498 bytes_per_second=51.6367Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/8                75.0 ns         74.8 ns      9343663 bytes_per_second=101.929Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/16               79.4 ns         79.2 ns      8837997 bytes_per_second=192.732Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/32               88.6 ns         88.3 ns      7935214 bytes_per_second=345.479Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/64               90.6 ns         90.3 ns      7741976 bytes_per_second=675.639Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/128               109 ns          109 ns      6438809 bytes_per_second=1.0968Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/256               120 ns          119 ns      5857845 bytes_per_second=1.99756Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/512               186 ns          186 ns      3765552 bytes_per_second=2.56813Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/1024              284 ns          283 ns      2474412 bytes_per_second=3.37194Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/2048              484 ns          483 ns      1450834 bytes_per_second=3.94717Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/4096              802 ns          800 ns       869473 bytes_per_second=4.76587Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/8192             1469 ns         1466 ns       477127 bytes_per_second=5.20439Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/16384            2700 ns         2693 ns       259821 bytes_per_second=5.66613Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/32768            4979 ns         4967 ns       140926 bytes_per_second=6.14388Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/65536           10431 ns        10405 ns        67137 bytes_per_second=5.86603Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/131072          22646 ns        22591 ns        30999 bytes_per_second=5.40348Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/262144          46278 ns        46148 ns        15156 bytes_per_second=5.29038Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/524288          91695 ns        91511 ns         7657 bytes_per_second=5.33577Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/1048576        195458 ns       194988 ns         3567 bytes_per_second=5.00831Gi/s
BM_format_to_n_string_back_inserter<std::list<char>>/1                  65.5 ns         65.4 ns     10691963 bytes_per_second=14.5921Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/2                  78.9 ns         78.7 ns      8920318 bytes_per_second=24.2294Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/4                   107 ns          107 ns      6540004 bytes_per_second=35.6329Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/8                   171 ns          171 ns      4108360 bytes_per_second=44.6311Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/16                  331 ns          330 ns      2121251 bytes_per_second=46.2379Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/32                  641 ns          640 ns      1097213 bytes_per_second=47.6889Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/64                 1237 ns         1233 ns       565941 bytes_per_second=49.4821Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/128                2474 ns         2469 ns       284645 bytes_per_second=49.4484Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/256                4984 ns         4972 ns       142037 bytes_per_second=49.0997Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/512                9740 ns         9716 ns        71542 bytes_per_second=50.2565Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/1024              19503 ns        19451 ns        35970 bytes_per_second=50.2075Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/2048              39078 ns        38981 ns        17962 bytes_per_second=50.1052Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/4096              78329 ns        78132 ns         8963 bytes_per_second=49.9954Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/8192             156689 ns       156291 ns         4467 bytes_per_second=49.9869Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/16384            313624 ns       312732 ns         2235 bytes_per_second=49.9629Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/32768            630336 ns       628711 ns         1108 bytes_per_second=49.7048Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/65536           1261542 ns      1258055 ns          555 bytes_per_second=49.6799Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/131072          2543001 ns      2535000 ns          275 bytes_per_second=49.3097Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/262144          5214390 ns      5191608 ns          125 bytes_per_second=48.1546Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/524288         10650366 ns     10609616 ns           62 bytes_per_second=47.1271Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/1048576        21677130 ns     21550764 ns           31 bytes_per_second=46.4021Mi/s
BM_format_to_n_string_begin<std::string>/1                              53.7 ns         53.5 ns     13041641 bytes_per_second=17.8119Mi/s
BM_format_to_n_string_begin<std::string>/2                              53.0 ns         52.9 ns     13243962 bytes_per_second=36.0447Mi/s
BM_format_to_n_string_begin<std::string>/4                              53.1 ns         53.0 ns     13167006 bytes_per_second=71.98Mi/s
BM_format_to_n_string_begin<std::string>/8                              53.6 ns         53.5 ns     13093098 bytes_per_second=142.591Mi/s
BM_format_to_n_string_begin<std::string>/16                             53.7 ns         53.5 ns     13020678 bytes_per_second=285.038Mi/s
BM_format_to_n_string_begin<std::string>/32                             53.9 ns         53.8 ns     13034246 bytes_per_second=567.706Mi/s
BM_format_to_n_string_begin<std::string>/64                             54.3 ns         54.2 ns     12901135 bytes_per_second=1.10027Gi/s
BM_format_to_n_string_begin<std::string>/128                            60.7 ns         60.5 ns     11605050 bytes_per_second=1.97014Gi/s
BM_format_to_n_string_begin<std::string>/256                            69.1 ns         68.9 ns     10172526 bytes_per_second=3.4582Gi/s
BM_format_to_n_string_begin<std::string>/512                            89.5 ns         89.3 ns      7814551 bytes_per_second=5.33874Gi/s
BM_format_to_n_string_begin<std::string>/1024                            132 ns          132 ns      5302589 bytes_per_second=7.23812Gi/s
BM_format_to_n_string_begin<std::string>/2048                            229 ns          228 ns      3070816 bytes_per_second=8.3559Gi/s
BM_format_to_n_string_begin<std::string>/4096                            425 ns          424 ns      1649496 bytes_per_second=8.98833Gi/s
BM_format_to_n_string_begin<std::string>/8192                            812 ns          810 ns       866484 bytes_per_second=9.42053Gi/s
BM_format_to_n_string_begin<std::string>/16384                          1656 ns         1652 ns       423179 bytes_per_second=9.23521Gi/s
BM_format_to_n_string_begin<std::string>/32768                          3179 ns         3171 ns       220456 bytes_per_second=9.62316Gi/s
BM_format_to_n_string_begin<std::string>/65536                          6818 ns         6802 ns       103122 bytes_per_second=8.97315Gi/s
BM_format_to_n_string_begin<std::string>/131072                        14829 ns        14788 ns        47434 bytes_per_second=8.25491Gi/s
BM_format_to_n_string_begin<std::string>/262144                        29547 ns        29471 ns        23756 bytes_per_second=8.28414Gi/s
BM_format_to_n_string_begin<std::string>/524288                        59436 ns        59284 ns        11787 bytes_per_second=8.2363Gi/s
BM_format_to_n_string_begin<std::string>/1048576                      120292 ns       119974 ns         5842 bytes_per_second=8.13979Gi/s
BM_format_to_n_string_begin<std::vector<char>>/1                        53.0 ns         52.9 ns     13395096 bytes_per_second=18.0263Mi/s
BM_format_to_n_string_begin<std::vector<char>>/2                        53.0 ns         52.9 ns     13255941 bytes_per_second=36.0868Mi/s
BM_format_to_n_string_begin<std::vector<char>>/4                        52.9 ns         52.8 ns     13208574 bytes_per_second=72.2285Mi/s
BM_format_to_n_string_begin<std::vector<char>>/8                        52.5 ns         52.4 ns     13349218 bytes_per_second=145.688Mi/s
BM_format_to_n_string_begin<std::vector<char>>/16                       52.7 ns         52.6 ns     13239180 bytes_per_second=290.223Mi/s
BM_format_to_n_string_begin<std::vector<char>>/32                       52.9 ns         52.8 ns     12857843 bytes_per_second=577.776Mi/s
BM_format_to_n_string_begin<std::vector<char>>/64                       53.3 ns         53.2 ns     13165818 bytes_per_second=1.12004Gi/s
BM_format_to_n_string_begin<std::vector<char>>/128                      58.8 ns         58.7 ns     11955351 bytes_per_second=2.03242Gi/s
BM_format_to_n_string_begin<std::vector<char>>/256                      72.7 ns         72.5 ns      9567121 bytes_per_second=3.28642Gi/s
BM_format_to_n_string_begin<std::vector<char>>/512                      96.6 ns         96.3 ns      7270746 bytes_per_second=4.9504Gi/s
BM_format_to_n_string_begin<std::vector<char>>/1024                      138 ns          138 ns      5074395 bytes_per_second=6.91338Gi/s
BM_format_to_n_string_begin<std::vector<char>>/2048                      235 ns          235 ns      2985729 bytes_per_second=8.13348Gi/s
BM_format_to_n_string_begin<std::vector<char>>/4096                      439 ns          438 ns      1597496 bytes_per_second=8.70102Gi/s
BM_format_to_n_string_begin<std::vector<char>>/8192                      853 ns          851 ns       823405 bytes_per_second=8.96488Gi/s
BM_format_to_n_string_begin<std::vector<char>>/16384                    1627 ns         1623 ns       429274 bytes_per_second=9.40197Gi/s
BM_format_to_n_string_begin<std::vector<char>>/32768                    3221 ns         3212 ns       218030 bytes_per_second=9.50016Gi/s
BM_format_to_n_string_begin<std::vector<char>>/65536                    7089 ns         7072 ns        98823 bytes_per_second=8.63113Gi/s
BM_format_to_n_string_begin<std::vector<char>>/131072                  15268 ns        15229 ns        46052 bytes_per_second=8.01568Gi/s
BM_format_to_n_string_begin<std::vector<char>>/262144                  30296 ns        30219 ns        23098 bytes_per_second=8.07902Gi/s
BM_format_to_n_string_begin<std::vector<char>>/524288                  61230 ns        61074 ns        11421 bytes_per_second=7.99487Gi/s
BM_format_to_n_string_begin<std::vector<char>>/1048576                124101 ns       123704 ns         5671 bytes_per_second=7.89434Gi/s
BM_format_to_n_string_begin<std::list<char>>/1                          49.0 ns         48.9 ns     14339585 bytes_per_second=19.5125Mi/s
BM_format_to_n_string_begin<std::list<char>>/2                          49.8 ns         49.6 ns     14059613 bytes_per_second=38.4293Mi/s
BM_format_to_n_string_begin<std::list<char>>/4                          50.9 ns         50.8 ns     13803755 bytes_per_second=75.0895Mi/s
BM_format_to_n_string_begin<std::list<char>>/8                          64.0 ns         63.8 ns     10943929 bytes_per_second=119.516Mi/s
BM_format_to_n_string_begin<std::list<char>>/16                         84.8 ns         84.6 ns      8276210 bytes_per_second=180.468Mi/s
BM_format_to_n_string_begin<std::list<char>>/32                          127 ns          127 ns      5517041 bytes_per_second=240.407Mi/s
BM_format_to_n_string_begin<std::list<char>>/64                          214 ns          213 ns      3276668 bytes_per_second=286.073Mi/s
BM_format_to_n_string_begin<std::list<char>>/128                         389 ns          388 ns      1795410 bytes_per_second=314.419Mi/s
BM_format_to_n_string_begin<std::list<char>>/256                         749 ns          747 ns       938533 bytes_per_second=326.8Mi/s
BM_format_to_n_string_begin<std::list<char>>/512                        1453 ns         1449 ns       483905 bytes_per_second=336.9Mi/s
BM_format_to_n_string_begin<std::list<char>>/1024                       2852 ns         2845 ns       245676 bytes_per_second=343.269Mi/s
BM_format_to_n_string_begin<std::list<char>>/2048                       5685 ns         5671 ns       122982 bytes_per_second=344.409Mi/s
BM_format_to_n_string_begin<std::list<char>>/4096                      11312 ns        11283 ns        61990 bytes_per_second=346.216Mi/s
BM_format_to_n_string_begin<std::list<char>>/8192                      22644 ns        22586 ns        31006 bytes_per_second=345.9Mi/s
BM_format_to_n_string_begin<std::list<char>>/16384                     45298 ns        45180 ns        15512 bytes_per_second=345.836Mi/s
BM_format_to_n_string_begin<std::list<char>>/32768                     90351 ns        90110 ns         7777 bytes_per_second=346.8Mi/s
BM_format_to_n_string_begin<std::list<char>>/65536                    180594 ns       180048 ns         3892 bytes_per_second=347.13Mi/s
BM_format_to_n_string_begin<std::list<char>>/131072                   373023 ns       371863 ns         1882 bytes_per_second=336.145Mi/s
BM_format_to_n_string_begin<std::list<char>>/262144                   895166 ns       891717 ns          713 bytes_per_second=280.358Mi/s
BM_format_to_n_string_begin<std::list<char>>/524288                  2209006 ns      2201104 ns          318 bytes_per_second=227.159Mi/s
BM_format_to_n_string_begin<std::list<char>>/1048576                 4421130 ns      4404315 ns          159 bytes_per_second=227.05Mi/s
BM_format_to_n_string_span<char>/1                                      53.3 ns         53.2 ns     13152297 bytes_per_second=17.9301Mi/s
BM_format_to_n_string_span<char>/2                                      52.5 ns         52.4 ns     13372731 bytes_per_second=36.4069Mi/s
BM_format_to_n_string_span<char>/4                                      52.8 ns         52.7 ns     13249176 bytes_per_second=72.3966Mi/s
BM_format_to_n_string_span<char>/8                                      52.9 ns         52.8 ns     13256871 bytes_per_second=144.603Mi/s
BM_format_to_n_string_span<char>/16                                     53.7 ns         53.5 ns     13086124 bytes_per_second=285.171Mi/s
BM_format_to_n_string_span<char>/32                                     53.4 ns         53.3 ns     13156961 bytes_per_second=572.554Mi/s
BM_format_to_n_string_span<char>/64                                     53.4 ns         53.1 ns     13208519 bytes_per_second=1.12209Gi/s
BM_format_to_n_string_span<char>/128                                    60.8 ns         60.7 ns     11537915 bytes_per_second=1.96458Gi/s
BM_format_to_n_string_span<char>/256                                    69.1 ns         69.0 ns     10221573 bytes_per_second=3.45715Gi/s
BM_format_to_n_string_span<char>/512                                    89.5 ns         89.3 ns      7857679 bytes_per_second=5.34184Gi/s
BM_format_to_n_string_span<char>/1024                                    134 ns          134 ns      5229017 bytes_per_second=7.12054Gi/s
BM_format_to_n_string_span<char>/2048                                    223 ns          222 ns      3148532 bytes_per_second=8.58077Gi/s
BM_format_to_n_string_span<char>/4096                                    427 ns          426 ns      1640906 bytes_per_second=8.9548Gi/s
BM_format_to_n_string_span<char>/8192                                    818 ns          816 ns       862045 bytes_per_second=9.35247Gi/s
BM_format_to_n_string_span<char>/16384                                  1622 ns         1617 ns       432033 bytes_per_second=9.43376Gi/s
BM_format_to_n_string_span<char>/32768                                  3137 ns         3129 ns       223336 bytes_per_second=9.75164Gi/s
BM_format_to_n_string_span<char>/65536                                  6698 ns         6682 ns       104597 bytes_per_second=9.13435Gi/s
BM_format_to_n_string_span<char>/131072                                14925 ns        14888 ns        46957 bytes_per_second=8.19897Gi/s
BM_format_to_n_string_span<char>/262144                                29688 ns        29603 ns        23654 bytes_per_second=8.24706Gi/s
BM_format_to_n_string_span<char>/524288                                59308 ns        59180 ns        11818 bytes_per_second=8.25073Gi/s
BM_format_to_n_string_span<char>/1048576                              118765 ns       118433 ns         5890 bytes_per_second=8.24568Gi/s
BM_format_to_n_string_pointer<char>/1                                   52.3 ns         52.2 ns     13388309 bytes_per_second=18.2682Mi/s
BM_format_to_n_string_pointer<char>/2                                   52.9 ns         52.8 ns     13272848 bytes_per_second=36.1233Mi/s
BM_format_to_n_string_pointer<char>/4                                   53.1 ns         52.9 ns     13228995 bytes_per_second=72.0969Mi/s
BM_format_to_n_string_pointer<char>/8                                   52.9 ns         52.8 ns     13249394 bytes_per_second=144.527Mi/s
BM_format_to_n_string_pointer<char>/16                                  52.6 ns         52.5 ns     13336233 bytes_per_second=290.602Mi/s
BM_format_to_n_string_pointer<char>/32                                  52.5 ns         52.4 ns     13331942 bytes_per_second=582.748Mi/s
BM_format_to_n_string_pointer<char>/64                                  53.5 ns         53.4 ns     13126493 bytes_per_second=1.11708Gi/s
BM_format_to_n_string_pointer<char>/128                                 62.4 ns         62.3 ns     11222983 bytes_per_second=1.9146Gi/s
BM_format_to_n_string_pointer<char>/256                                 69.5 ns         69.4 ns     10086274 bytes_per_second=3.43692Gi/s
BM_format_to_n_string_pointer<char>/512                                 88.3 ns         88.1 ns      7929196 bytes_per_second=5.41346Gi/s
BM_format_to_n_string_pointer<char>/1024                                 131 ns          131 ns      5357630 bytes_per_second=7.29499Gi/s
BM_format_to_n_string_pointer<char>/2048                                 226 ns          225 ns      3099073 bytes_per_second=8.46339Gi/s
BM_format_to_n_string_pointer<char>/4096                                 426 ns          425 ns      1646323 bytes_per_second=8.97431Gi/s
BM_format_to_n_string_pointer<char>/8192                                 815 ns          813 ns       859395 bytes_per_second=9.38067Gi/s
BM_format_to_n_string_pointer<char>/16384                               1618 ns         1614 ns       432959 bytes_per_second=9.45405Gi/s
BM_format_to_n_string_pointer<char>/32768                               3137 ns         3129 ns       223694 bytes_per_second=9.75173Gi/s
BM_format_to_n_string_pointer<char>/65536                               6693 ns         6675 ns       104933 bytes_per_second=9.14424Gi/s
BM_format_to_n_string_pointer<char>/131072                             14912 ns        14876 ns        47053 bytes_per_second=8.20589Gi/s
BM_format_to_n_string_pointer<char>/262144                             29685 ns        29609 ns        23651 bytes_per_second=8.24549Gi/s
BM_format_to_n_string_pointer<char>/524288                             59254 ns        59133 ns        11837 bytes_per_second=8.25738Gi/s
BM_format_to_n_string_pointer<char>/1048576                           118746 ns       118523 ns         5911 bytes_per_second=8.2394Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/1                     57.5 ns         57.3 ns     12220461 bytes_per_second=66.5332Mi/s
BM_format_to_n_string_back_inserter<std::wstring>/2                     57.4 ns         57.2 ns     12204054 bytes_per_second=133.333Mi/s
BM_format_to_n_string_back_inserter<std::wstring>/4                     57.3 ns         57.2 ns     12223980 bytes_per_second=266.784Mi/s
BM_format_to_n_string_back_inserter<std::wstring>/8                     77.0 ns         76.8 ns      9139240 bytes_per_second=397.372Mi/s
BM_format_to_n_string_back_inserter<std::wstring>/16                    78.2 ns         78.0 ns      8964082 bytes_per_second=782.577Mi/s
BM_format_to_n_string_back_inserter<std::wstring>/32                    92.9 ns         92.6 ns      7565173 bytes_per_second=1.28711Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/64                     103 ns          103 ns      6811965 bytes_per_second=2.3225Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/128                    159 ns          159 ns      4405973 bytes_per_second=3.00338Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/256                    288 ns          287 ns      2435586 bytes_per_second=3.31766Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/512                    484 ns          483 ns      1449916 bytes_per_second=3.94838Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/1024                   817 ns          815 ns       856668 bytes_per_second=4.68114Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/2048                  1553 ns         1549 ns       451120 bytes_per_second=4.92413Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/4096                  2984 ns         2977 ns       235097 bytes_per_second=5.12583Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/8192                  5893 ns         5878 ns       119106 bytes_per_second=5.19202Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/16384                12448 ns        12412 ns        56460 bytes_per_second=4.91758Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/32768                25981 ns        25918 ns        27056 bytes_per_second=4.7099Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/65536                52551 ns        52422 ns        13313 bytes_per_second=4.65723Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/131072              107130 ns       106904 ns         6544 bytes_per_second=4.56746Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/262144              229385 ns       228860 ns         3050 bytes_per_second=4.26707Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/524288              635498 ns       633625 ns         1077 bytes_per_second=3.08246Gi/s
BM_format_to_n_string_back_inserter<std::wstring>/1048576            1433803 ns      1428452 ns          484 bytes_per_second=2.7346Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/1             70.5 ns         70.3 ns      9940095 bytes_per_second=54.2572Mi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/2             70.7 ns         70.6 ns      9934856 bytes_per_second=108.129Mi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/4             73.2 ns         73.0 ns      9588422 bytes_per_second=209.069Mi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/8             75.6 ns         75.4 ns      9285318 bytes_per_second=404.488Mi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/16            79.9 ns         79.7 ns      8792551 bytes_per_second=766.115Mi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/32             104 ns          104 ns      6731654 bytes_per_second=1.14643Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/64             137 ns          137 ns      5110206 bytes_per_second=1.739Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/128            225 ns          225 ns      3119091 bytes_per_second=2.12152Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/256            338 ns          337 ns      2076273 bytes_per_second=2.82731Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/512            546 ns          544 ns      1266193 bytes_per_second=3.50459Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/1024           872 ns          870 ns       803018 bytes_per_second=4.3864Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/2048          1553 ns         1551 ns       448165 bytes_per_second=4.91783Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/4096          2719 ns         2719 ns       257081 bytes_per_second=5.61113Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/8192          5032 ns         5033 ns       139480 bytes_per_second=6.06401Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/16384        10447 ns        10447 ns        67169 bytes_per_second=5.84251Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/32768        22749 ns        22749 ns        30716 bytes_per_second=5.36591Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/65536        46382 ns        46383 ns        15107 bytes_per_second=5.26353Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/131072       91122 ns        91123 ns         7643 bytes_per_second=5.35849Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/262144      189609 ns       189589 ns         3730 bytes_per_second=5.15094Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/524288      604574 ns       604526 ns         1153 bytes_per_second=3.23084Gi/s
BM_format_to_n_string_back_inserter<std::vector<wchar_t>>/1048576    1419322 ns      1419261 ns          489 bytes_per_second=2.75231Gi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/1               63.6 ns         63.6 ns     11046791 bytes_per_second=59.9824Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/2               77.7 ns         77.7 ns      9013447 bytes_per_second=98.1427Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/4                106 ns          106 ns      6608662 bytes_per_second=144.104Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/8                171 ns          171 ns      4100338 bytes_per_second=177.949Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/16               333 ns          333 ns      2090106 bytes_per_second=183.038Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/32               665 ns          665 ns      1051827 bytes_per_second=183.55Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/64              1277 ns         1277 ns       547868 bytes_per_second=191.143Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/128             2531 ns         2531 ns       275172 bytes_per_second=192.953Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/256             5071 ns         5070 ns       138777 bytes_per_second=192.603Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/512             9998 ns         9998 ns        69940 bytes_per_second=195.344Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/1024           20060 ns        20060 ns        34925 bytes_per_second=194.725Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/2048           40194 ns        40195 ns        17413 bytes_per_second=194.365Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/4096           80358 ns        80359 ns         8721 bytes_per_second=194.439Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/8192          161371 ns       161364 ns         4334 bytes_per_second=193.662Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/16384         323119 ns       323121 ns         2166 bytes_per_second=193.426Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/32768         646629 ns       646587 ns         1075 bytes_per_second=193.323Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/65536        1292611 ns      1292597 ns          541 bytes_per_second=193.409Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/131072       2616640 ns      2616409 ns          267 bytes_per_second=191.102Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/262144       5414119 ns      5414122 ns          124 bytes_per_second=184.702Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/524288      10974467 ns     10974049 ns           59 bytes_per_second=182.248Mi/s
BM_format_to_n_string_back_inserter<std::list<wchar_t>>/1048576     22293729 ns     22293492 ns           30 bytes_per_second=179.425Mi/s
BM_format_to_n_string_begin<std::wstring>/1                             52.0 ns         52.0 ns     13513725 bytes_per_second=73.3442Mi/s
BM_format_to_n_string_begin<std::wstring>/2                             51.7 ns         51.7 ns     13424668 bytes_per_second=147.671Mi/s
BM_format_to_n_string_begin<std::wstring>/4                             51.9 ns         51.9 ns     13509922 bytes_per_second=294.176Mi/s
BM_format_to_n_string_begin<std::wstring>/8                             52.0 ns         52.0 ns     13465404 bytes_per_second=587.05Mi/s
BM_format_to_n_string_begin<std::wstring>/16                            52.5 ns         52.5 ns     13500423 bytes_per_second=1.13543Gi/s
BM_format_to_n_string_begin<std::wstring>/32                            56.4 ns         56.4 ns     12405180 bytes_per_second=2.11547Gi/s
BM_format_to_n_string_begin<std::wstring>/64                            67.6 ns         67.6 ns     10352129 bytes_per_second=3.52698Gi/s
BM_format_to_n_string_begin<std::wstring>/128                           93.9 ns         93.9 ns      7522376 bytes_per_second=5.07921Gi/s
BM_format_to_n_string_begin<std::wstring>/256                            133 ns          133 ns      5247826 bytes_per_second=7.16001Gi/s
BM_format_to_n_string_begin<std::wstring>/512                            231 ns          231 ns      3023825 bytes_per_second=8.24208Gi/s
BM_format_to_n_string_begin<std::wstring>/1024                           424 ns          424 ns      1649402 bytes_per_second=8.99487Gi/s
BM_format_to_n_string_begin<std::wstring>/2048                           830 ns          830 ns       848532 bytes_per_second=9.19095Gi/s
BM_format_to_n_string_begin<std::wstring>/4096                          1679 ns         1679 ns       416070 bytes_per_second=9.09029Gi/s
BM_format_to_n_string_begin<std::wstring>/8192                          3213 ns         3213 ns       218136 bytes_per_second=9.49747Gi/s
BM_format_to_n_string_begin<std::wstring>/16384                         6838 ns         6838 ns       102068 bytes_per_second=8.92627Gi/s
BM_format_to_n_string_begin<std::wstring>/32768                        14764 ns        14764 ns        47436 bytes_per_second=8.26818Gi/s
BM_format_to_n_string_begin<std::wstring>/65536                        29714 ns        29714 ns        23491 bytes_per_second=8.21633Gi/s
BM_format_to_n_string_begin<std::wstring>/131072                       59647 ns        59644 ns        11780 bytes_per_second=8.18662Gi/s
BM_format_to_n_string_begin<std::wstring>/262144                      119454 ns       119456 ns         5863 bytes_per_second=8.17507Gi/s
BM_format_to_n_string_begin<std::wstring>/524288                      286293 ns       286295 ns         2442 bytes_per_second=6.82206Gi/s
BM_format_to_n_string_begin<std::wstring>/1048576                     911579 ns       911595 ns          766 bytes_per_second=4.28507Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/1                     51.3 ns         51.3 ns     13635395 bytes_per_second=74.3867Mi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/2                     51.0 ns         51.0 ns     13736606 bytes_per_second=149.493Mi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/4                     51.3 ns         51.3 ns     13656750 bytes_per_second=297.64Mi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/8                     51.1 ns         51.1 ns     12622517 bytes_per_second=597.171Mi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/16                    51.5 ns         51.5 ns     13233009 bytes_per_second=1.15659Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/32                    55.9 ns         55.9 ns     12520247 bytes_per_second=2.13093Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/64                    68.3 ns         68.3 ns     10250969 bytes_per_second=3.49104Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/128                   94.1 ns         94.1 ns      7450735 bytes_per_second=5.06522Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/256                    135 ns          135 ns      5189630 bytes_per_second=7.07126Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/512                    236 ns          236 ns      2969116 bytes_per_second=8.08995Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/1024                   440 ns          440 ns      1591408 bytes_per_second=8.678Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/2048                   853 ns          853 ns       814193 bytes_per_second=8.94736Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/4096                  1634 ns         1634 ns       427050 bytes_per_second=9.33682Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/8192                  3209 ns         3209 ns       217702 bytes_per_second=9.50934Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/16384                 7058 ns         7058 ns        99366 bytes_per_second=8.64797Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/32768                15116 ns        15115 ns        46380 bytes_per_second=8.07629Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/65536                30376 ns        30377 ns        23028 bytes_per_second=8.03712Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/131072               60970 ns        60971 ns        11499 bytes_per_second=8.00836Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/262144              122493 ns       122497 ns         5720 bytes_per_second=7.97217Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/524288              290542 ns       290527 ns         2408 bytes_per_second=6.72271Gi/s
BM_format_to_n_string_begin<std::vector<wchar_t>>/1048576             910702 ns       910584 ns          768 bytes_per_second=4.28983Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/1                       47.6 ns         47.6 ns     14679442 bytes_per_second=80.1266Mi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/2                       47.9 ns         47.9 ns     14631935 bytes_per_second=159.286Mi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/4                       51.3 ns         51.3 ns     13651671 bytes_per_second=297.535Mi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/8                       62.1 ns         62.1 ns     11280271 bytes_per_second=491.363Mi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/16                      83.3 ns         83.3 ns      8403480 bytes_per_second=732.6Mi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/32                       132 ns          132 ns      5270514 bytes_per_second=923.772Mi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/64                       225 ns          225 ns      3115251 bytes_per_second=1.0616Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/128                      411 ns          411 ns      1701267 bytes_per_second=1.15947Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/256                      769 ns          769 ns       908949 bytes_per_second=1.24006Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/512                     1491 ns         1491 ns       468414 bytes_per_second=1.27953Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/1024                    2957 ns         2957 ns       236899 bytes_per_second=1.28999Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/2048                    5843 ns         5843 ns       120170 bytes_per_second=1.30569Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/4096                   11544 ns        11544 ns        60622 bytes_per_second=1.32184Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/8192                   23435 ns        23435 ns        29848 bytes_per_second=1.3022Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/16384                  47005 ns        47006 ns        14899 bytes_per_second=1.29844Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/32768                  93735 ns        93735 ns         7461 bytes_per_second=1.30229Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/65536                 187187 ns       187181 ns         3741 bytes_per_second=1.3043Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/131072                387031 ns       387029 ns         1799 bytes_per_second=1.26161Gi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/262144               1002722 ns      1002684 ns          695 bytes_per_second=997.323Mi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/524288               2354693 ns      2354599 ns          297 bytes_per_second=849.402Mi/s
BM_format_to_n_string_begin<std::list<wchar_t>>/1048576              4864712 ns      4864581 ns          144 bytes_per_second=822.27Mi/s
BM_format_to_n_string_span<wchar_t>/1                                   50.6 ns         50.6 ns     13863954 bytes_per_second=75.4097Mi/s
BM_format_to_n_string_span<wchar_t>/2                                   50.7 ns         50.7 ns     13793656 bytes_per_second=150.425Mi/s
BM_format_to_n_string_span<wchar_t>/4                                   51.4 ns         51.4 ns     13645021 bytes_per_second=296.823Mi/s
BM_format_to_n_string_span<wchar_t>/8                                   51.2 ns         51.2 ns     13623522 bytes_per_second=595.898Mi/s
BM_format_to_n_string_span<wchar_t>/16                                  51.7 ns         51.7 ns     13610614 bytes_per_second=1.15303Gi/s
BM_format_to_n_string_span<wchar_t>/32                                  56.0 ns         56.0 ns     12451328 bytes_per_second=2.12771Gi/s
BM_format_to_n_string_span<wchar_t>/64                                  66.3 ns         66.3 ns     10524699 bytes_per_second=3.59561Gi/s
BM_format_to_n_string_span<wchar_t>/128                                 88.1 ns         88.1 ns      7938215 bytes_per_second=5.40999Gi/s
BM_format_to_n_string_span<wchar_t>/256                                  128 ns          128 ns      5456422 bytes_per_second=7.43012Gi/s
BM_format_to_n_string_span<wchar_t>/512                                  223 ns          223 ns      3142735 bytes_per_second=8.55933Gi/s
BM_format_to_n_string_span<wchar_t>/1024                                 428 ns          428 ns      1638744 bytes_per_second=8.92023Gi/s
BM_format_to_n_string_span<wchar_t>/2048                                 829 ns          829 ns       850093 bytes_per_second=9.20356Gi/s
BM_format_to_n_string_span<wchar_t>/4096                                1613 ns         1613 ns       432184 bytes_per_second=9.46179Gi/s
BM_format_to_n_string_span<wchar_t>/8192                                3151 ns         3151 ns       222389 bytes_per_second=9.68385Gi/s
BM_format_to_n_string_span<wchar_t>/16384                               6999 ns         7000 ns        99528 bytes_per_second=8.71988Gi/s
BM_format_to_n_string_span<wchar_t>/32768                              14819 ns        14818 ns        47207 bytes_per_second=8.23778Gi/s
BM_format_to_n_string_span<wchar_t>/65536                              29640 ns        29641 ns        23619 bytes_per_second=8.23659Gi/s
BM_format_to_n_string_span<wchar_t>/131072                             59443 ns        59440 ns        11783 bytes_per_second=8.21464Gi/s
BM_format_to_n_string_span<wchar_t>/262144                            118942 ns       118944 ns         5868 bytes_per_second=8.2103Gi/s
BM_format_to_n_string_span<wchar_t>/524288                            288199 ns       288173 ns         2431 bytes_per_second=6.77761Gi/s
BM_format_to_n_string_span<wchar_t>/1048576                           912877 ns       912855 ns          766 bytes_per_second=4.27916Gi/s
BM_format_to_n_string_pointer<wchar_t>/1                                50.7 ns         50.7 ns     13760222 bytes_per_second=75.2909Mi/s
BM_format_to_n_string_pointer<wchar_t>/2                                50.9 ns         50.9 ns     13753058 bytes_per_second=149.952Mi/s
BM_format_to_n_string_pointer<wchar_t>/4                                51.5 ns         51.5 ns     13580976 bytes_per_second=296.297Mi/s
BM_format_to_n_string_pointer<wchar_t>/8                                51.3 ns         51.3 ns     13646126 bytes_per_second=594.92Mi/s
BM_format_to_n_string_pointer<wchar_t>/16                               51.6 ns         51.6 ns     13583615 bytes_per_second=1.156Gi/s
BM_format_to_n_string_pointer<wchar_t>/32                               56.2 ns         56.2 ns     12474119 bytes_per_second=2.12153Gi/s
BM_format_to_n_string_pointer<wchar_t>/64                               66.4 ns         66.4 ns     10534648 bytes_per_second=3.58917Gi/s
BM_format_to_n_string_pointer<wchar_t>/128                              88.1 ns         88.1 ns      7950562 bytes_per_second=5.40973Gi/s
BM_format_to_n_string_pointer<wchar_t>/256                               129 ns          129 ns      5437624 bytes_per_second=7.39644Gi/s
BM_format_to_n_string_pointer<wchar_t>/512                               224 ns          224 ns      3120869 bytes_per_second=8.50226Gi/s
BM_format_to_n_string_pointer<wchar_t>/1024                              429 ns          429 ns      1631703 bytes_per_second=8.89102Gi/s
BM_format_to_n_string_pointer<wchar_t>/2048                              822 ns          822 ns       846043 bytes_per_second=9.28063Gi/s
BM_format_to_n_string_pointer<wchar_t>/4096                             1616 ns         1616 ns       431533 bytes_per_second=9.44167Gi/s
BM_format_to_n_string_pointer<wchar_t>/8192                             3151 ns         3151 ns       221539 bytes_per_second=9.68612Gi/s
BM_format_to_n_string_pointer<wchar_t>/16384                            6967 ns         6967 ns       100616 bytes_per_second=8.76067Gi/s
BM_format_to_n_string_pointer<wchar_t>/32768                           14734 ns        14734 ns        47573 bytes_per_second=8.285Gi/s
BM_format_to_n_string_pointer<wchar_t>/65536                           29502 ns        29502 ns        23727 bytes_per_second=8.27539Gi/s
BM_format_to_n_string_pointer<wchar_t>/131072                          59189 ns        59187 ns        11868 bytes_per_second=8.24977Gi/s
BM_format_to_n_string_pointer<wchar_t>/262144                         118521 ns       118524 ns         5903 bytes_per_second=8.2394Gi/s
BM_format_to_n_string_pointer<wchar_t>/524288                         288848 ns       288823 ns         2432 bytes_per_second=6.76236Gi/s
BM_format_to_n_string_pointer<wchar_t>/1048576                        912304 ns       912281 ns          765 bytes_per_second=4.28185Gi/s

After
----------------------------------------------------------------------------------------------------------------------------
Benchmark                                                                  Time             CPU   Iterations UserCounters...
----------------------------------------------------------------------------------------------------------------------------
BM_format_to_n_string_back_inserter<std::string>/1                      58.3 ns         58.3 ns     11894752 bytes_per_second=16.3678Mi/s
BM_format_to_n_string_back_inserter<std::string>/2                      58.6 ns         58.6 ns     11930741 bytes_per_second=32.5454Mi/s
BM_format_to_n_string_back_inserter<std::string>/4                      58.7 ns         58.7 ns     11939708 bytes_per_second=65.0315Mi/s
BM_format_to_n_string_back_inserter<std::string>/8                      58.5 ns         58.5 ns     11961911 bytes_per_second=130.361Mi/s
BM_format_to_n_string_back_inserter<std::string>/16                     58.5 ns         58.5 ns     12024579 bytes_per_second=260.963Mi/s
BM_format_to_n_string_back_inserter<std::string>/32                     76.7 ns         76.7 ns      9105849 bytes_per_second=397.672Mi/s
BM_format_to_n_string_back_inserter<std::string>/64                     76.8 ns         76.8 ns      9132067 bytes_per_second=795.158Mi/s
BM_format_to_n_string_back_inserter<std::string>/128                    77.4 ns         77.4 ns      9036342 bytes_per_second=1.53966Gi/s
BM_format_to_n_string_back_inserter<std::string>/256                    90.0 ns         90.0 ns      7772798 bytes_per_second=2.64943Gi/s
BM_format_to_n_string_back_inserter<std::string>/512                     136 ns          136 ns      5146311 bytes_per_second=3.51286Gi/s
BM_format_to_n_string_back_inserter<std::string>/1024                    257 ns          257 ns      2721554 bytes_per_second=3.70954Gi/s
BM_format_to_n_string_back_inserter<std::string>/2048                    413 ns          413 ns      1694544 bytes_per_second=4.61394Gi/s
BM_format_to_n_string_back_inserter<std::string>/4096                    668 ns          668 ns      1048318 bytes_per_second=5.71409Gi/s
BM_format_to_n_string_back_inserter<std::string>/8192                   1116 ns         1116 ns       625793 bytes_per_second=6.83872Gi/s
BM_format_to_n_string_back_inserter<std::string>/16384                  2357 ns         2357 ns       297204 bytes_per_second=6.47413Gi/s
BM_format_to_n_string_back_inserter<std::string>/32768                  4467 ns         4467 ns       156599 bytes_per_second=6.83149Gi/s
BM_format_to_n_string_back_inserter<std::string>/65536                  9366 ns         9366 ns        74666 bytes_per_second=6.51672Gi/s
BM_format_to_n_string_back_inserter<std::string>/131072                19923 ns        19923 ns        35254 bytes_per_second=6.12721Gi/s
BM_format_to_n_string_back_inserter<std::string>/262144                42798 ns        42798 ns        16329 bytes_per_second=5.70446Gi/s
BM_format_to_n_string_back_inserter<std::string>/524288                87261 ns        87257 ns         7998 bytes_per_second=5.59592Gi/s
BM_format_to_n_string_back_inserter<std::string>/1048576              181427 ns       181426 ns         3849 bytes_per_second=5.3827Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/1                72.0 ns         72.0 ns      9698638 bytes_per_second=13.2527Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/2                73.3 ns         73.3 ns      9565537 bytes_per_second=26.0322Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/4                73.9 ns         73.9 ns      9483910 bytes_per_second=51.6234Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/8                75.7 ns         75.7 ns      9205102 bytes_per_second=100.761Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/16               79.2 ns         79.2 ns      8841952 bytes_per_second=192.631Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/32               90.1 ns         90.1 ns      7809568 bytes_per_second=338.856Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/64               89.9 ns         89.9 ns      7783634 bytes_per_second=679.293Mi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/128              91.2 ns         91.2 ns      7677201 bytes_per_second=1.30693Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/256               108 ns          108 ns      6493267 bytes_per_second=2.21248Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/512               165 ns          165 ns      4241778 bytes_per_second=2.88381Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/1024              250 ns          250 ns      2797074 bytes_per_second=3.80765Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/2048              404 ns          404 ns      1731642 bytes_per_second=4.72376Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/4096              629 ns          629 ns      1115298 bytes_per_second=6.0654Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/8192             1053 ns         1053 ns       661168 bytes_per_second=7.24586Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/16384            2062 ns         2062 ns       338457 bytes_per_second=7.40132Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/32768            3805 ns         3805 ns       183818 bytes_per_second=8.02137Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/65536            7558 ns         7558 ns        92613 bytes_per_second=8.07602Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/131072          16973 ns        16973 ns        41293 bytes_per_second=7.19215Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/262144          37110 ns        37111 ns        18845 bytes_per_second=6.57874Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/524288          73110 ns        73108 ns         9592 bytes_per_second=6.67894Gi/s
BM_format_to_n_string_back_inserter<std::vector<char>>/1048576        149194 ns       149197 ns         4635 bytes_per_second=6.54548Gi/s
BM_format_to_n_string_back_inserter<std::list<char>>/1                  65.8 ns         65.8 ns     10641306 bytes_per_second=14.493Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/2                  79.4 ns         79.4 ns      8823359 bytes_per_second=24.0097Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/4                   107 ns          107 ns      6538116 bytes_per_second=35.6288Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/8                   180 ns          180 ns      3883077 bytes_per_second=42.4124Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/16                  334 ns          334 ns      2097317 bytes_per_second=45.6725Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/32                  662 ns          662 ns      1043514 bytes_per_second=46.1005Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/64                 1267 ns         1267 ns       553510 bytes_per_second=48.1803Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/128                2480 ns         2480 ns       283417 bytes_per_second=49.2188Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/256                4923 ns         4924 ns       142727 bytes_per_second=49.5863Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/512                9812 ns         9811 ns        71351 bytes_per_second=49.7668Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/1024              19590 ns        19591 ns        35686 bytes_per_second=49.8475Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/2048              39161 ns        39159 ns        17860 bytes_per_second=49.8767Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/4096              78316 ns        78315 ns         8920 bytes_per_second=49.8788Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/8192             156709 ns       156699 ns         4462 bytes_per_second=49.8566Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/16384            312842 ns       312842 ns         2239 bytes_per_second=49.9454Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/32768            629744 ns       629751 ns         1106 bytes_per_second=49.6228Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/65536           1257851 ns      1257872 ns          553 bytes_per_second=49.6871Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/131072          2531022 ns      2530835 ns          275 bytes_per_second=49.3908Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/262144          5182786 ns      5182661 ns          124 bytes_per_second=48.2378Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/524288         10566644 ns     10566709 ns           62 bytes_per_second=47.3184Mi/s
BM_format_to_n_string_back_inserter<std::list<char>>/1048576        21319849 ns     21318080 ns           31 bytes_per_second=46.9085Mi/s
BM_format_to_n_string_begin<std::string>/1                              48.7 ns         48.7 ns     14301196 bytes_per_second=19.5919Mi/s
BM_format_to_n_string_begin<std::string>/2                              48.5 ns         48.5 ns     14418491 bytes_per_second=39.3467Mi/s
BM_format_to_n_string_begin<std::string>/4                              48.5 ns         48.5 ns     14435510 bytes_per_second=78.6366Mi/s
BM_format_to_n_string_begin<std::string>/8                              48.5 ns         48.5 ns     14434663 bytes_per_second=157.36Mi/s
BM_format_to_n_string_begin<std::string>/16                             48.5 ns         48.5 ns     14447251 bytes_per_second=314.86Mi/s
BM_format_to_n_string_begin<std::string>/32                             47.9 ns         47.9 ns     14603136 bytes_per_second=636.898Mi/s
BM_format_to_n_string_begin<std::string>/64                             48.3 ns         48.3 ns     14492719 bytes_per_second=1.23435Gi/s
BM_format_to_n_string_begin<std::string>/128                            48.2 ns         48.2 ns     14539008 bytes_per_second=2.47366Gi/s
BM_format_to_n_string_begin<std::string>/256                            50.0 ns         50.0 ns     14021955 bytes_per_second=4.7704Gi/s
BM_format_to_n_string_begin<std::string>/512                            52.6 ns         52.6 ns     13310671 bytes_per_second=9.06757Gi/s
BM_format_to_n_string_begin<std::string>/1024                           56.2 ns         56.2 ns     12459389 bytes_per_second=16.9652Gi/s
BM_format_to_n_string_begin<std::string>/2048                           67.2 ns         67.2 ns     10432897 bytes_per_second=28.3795Gi/s
BM_format_to_n_string_begin<std::string>/4096                            101 ns          101 ns      6911640 bytes_per_second=37.6209Gi/s
BM_format_to_n_string_begin<std::string>/8192                            150 ns          150 ns      4664235 bytes_per_second=50.8575Gi/s
BM_format_to_n_string_begin<std::string>/16384                           308 ns          308 ns      2225795 bytes_per_second=49.5371Gi/s
BM_format_to_n_string_begin<std::string>/32768                          1339 ns         1339 ns       521726 bytes_per_second=22.7997Gi/s
BM_format_to_n_string_begin<std::string>/65536                          3293 ns         3293 ns       212565 bytes_per_second=18.5337Gi/s
BM_format_to_n_string_begin<std::string>/131072                         6596 ns         6596 ns       106272 bytes_per_second=18.5063Gi/s
BM_format_to_n_string_begin<std::string>/262144                        14064 ns        14065 ns        49774 bytes_per_second=17.3584Gi/s
BM_format_to_n_string_begin<std::string>/524288                        29428 ns        29428 ns        23775 bytes_per_second=16.5921Gi/s
BM_format_to_n_string_begin<std::string>/1048576                       58666 ns        58666 ns        11893 bytes_per_second=16.6463Gi/s
BM_format_to_n_string_begin<std::vector<char>>/1                        48.0 ns         48.0 ns     14564573 bytes_per_second=19.8636Mi/s
BM_format_to_n_string_begin<std::vector<char>>/2                        48.4 ns         48.4 ns     14445531 bytes_per_second=39.372Mi/s
BM_format_to_n_string_begin<std::vector<char>>/4                        48.1 ns         48.1 ns     14579370 bytes_per_second=79.3003Mi/s
BM_format_to_n_string_begin<std::vector<char>>/8                        48.3 ns         48.3 ns     14510269 bytes_per_second=158.113Mi/s
BM_format_to_n_string_begin<std::vector<char>>/16                       48.4 ns         48.4 ns     14452809 bytes_per_second=314.976Mi/s
BM_format_to_n_string_begin<std::vector<char>>/32                       48.1 ns         48.1 ns     14578127 bytes_per_second=634.858Mi/s
BM_format_to_n_string_begin<std::vector<char>>/64                       48.4 ns         48.4 ns     14454174 bytes_per_second=1.2304Gi/s
BM_format_to_n_string_begin<std::vector<char>>/128                      48.4 ns         48.4 ns     14454299 bytes_per_second=2.46269Gi/s
BM_format_to_n_string_begin<std::vector<char>>/256                      49.1 ns         49.1 ns     14271076 bytes_per_second=4.85671Gi/s
BM_format_to_n_string_begin<std::vector<char>>/512                      52.6 ns         52.6 ns     13331231 bytes_per_second=9.06458Gi/s
BM_format_to_n_string_begin<std::vector<char>>/1024                     55.6 ns         55.6 ns     12610443 bytes_per_second=17.1486Gi/s
BM_format_to_n_string_begin<std::vector<char>>/2048                     67.0 ns         67.0 ns     10439580 bytes_per_second=28.476Gi/s
BM_format_to_n_string_begin<std::vector<char>>/4096                     97.6 ns         97.6 ns      7184733 bytes_per_second=39.1032Gi/s
BM_format_to_n_string_begin<std::vector<char>>/8192                      151 ns          151 ns      4633388 bytes_per_second=50.5215Gi/s
BM_format_to_n_string_begin<std::vector<char>>/16384                     315 ns          315 ns      2185686 bytes_per_second=48.4704Gi/s
BM_format_to_n_string_begin<std::vector<char>>/32768                    1345 ns         1345 ns       519043 bytes_per_second=22.6814Gi/s
BM_format_to_n_string_begin<std::vector<char>>/65536                    3295 ns         3295 ns       212381 bytes_per_second=18.5221Gi/s
BM_format_to_n_string_begin<std::vector<char>>/131072                   6591 ns         6590 ns       105414 bytes_per_second=18.5223Gi/s
BM_format_to_n_string_begin<std::vector<char>>/262144                  14084 ns        14084 ns        49765 bytes_per_second=17.3344Gi/s
BM_format_to_n_string_begin<std::vector<char>>/524288                  30239 ns        30238 ns        23144 bytes_per_second=16.1477Gi/s
BM_format_to_n_string_begin<std::vector<char>>/1048576                 60270 ns        60271 ns        11619 bytes_per_second=16.2028Gi/s
BM_format_to_n_string_begin<std::list<char>>/1                          50.9 ns         50.9 ns     13783105 bytes_per_second=18.7485Mi/s
BM_format_to_n_string_begin<std::list<char>>/2                          51.1 ns         51.1 ns     13641522 bytes_per_second=37.3058Mi/s
BM_format_to_n_string_begin<std::list<char>>/4                          52.9 ns         52.9 ns     13255629 bytes_per_second=72.1149Mi/s
BM_format_to_n_string_begin<std::list<char>>/8                          61.5 ns         61.5 ns     11386841 bytes_per_second=123.981Mi/s
BM_format_to_n_string_begin<std::list<char>>/16                         82.8 ns         82.9 ns      8448851 bytes_per_second=184.17Mi/s
BM_format_to_n_string_begin<std::list<char>>/32                          126 ns          126 ns      5558591 bytes_per_second=242.13Mi/s
BM_format_to_n_string_begin<std::list<char>>/64                          212 ns          212 ns      3298201 bytes_per_second=287.444Mi/s
BM_format_to_n_string_begin<std::list<char>>/128                         385 ns          385 ns      1820237 bytes_per_second=317.326Mi/s
BM_format_to_n_string_begin<std::list<char>>/256                         746 ns          746 ns       934390 bytes_per_second=327.096Mi/s
BM_format_to_n_string_begin<std::list<char>>/512                        1439 ns         1439 ns       487631 bytes_per_second=339.402Mi/s
BM_format_to_n_string_begin<std::list<char>>/1024                       2883 ns         2882 ns       242058 bytes_per_second=338.795Mi/s
BM_format_to_n_string_begin<std::list<char>>/2048                       5735 ns         5735 ns       121554 bytes_per_second=340.565Mi/s
BM_format_to_n_string_begin<std::list<char>>/4096                      11360 ns        11360 ns        61656 bytes_per_second=343.875Mi/s
BM_format_to_n_string_begin<std::list<char>>/8192                      23030 ns        23030 ns        30381 bytes_per_second=339.224Mi/s
BM_format_to_n_string_begin<std::list<char>>/16384                     45959 ns        45958 ns        15229 bytes_per_second=339.985Mi/s
BM_format_to_n_string_begin<std::list<char>>/32768                     91864 ns        91864 ns         7639 bytes_per_second=340.178Mi/s
BM_format_to_n_string_begin<std::list<char>>/65536                    183305 ns       183298 ns         3821 bytes_per_second=340.976Mi/s
BM_format_to_n_string_begin<std::list<char>>/131072                   375274 ns       375279 ns         1868 bytes_per_second=333.086Mi/s
BM_format_to_n_string_begin<std::list<char>>/262144                   863452 ns       863366 ns          811 bytes_per_second=289.564Mi/s
BM_format_to_n_string_begin<std::list<char>>/524288                  2044442 ns      2044356 ns          342 bytes_per_second=244.576Mi/s
BM_format_to_n_string_begin<std::list<char>>/1048576                 4349820 ns      4349352 ns          161 bytes_per_second=229.919Mi/s
BM_format_to_n_string_span<char>/1                                      48.1 ns         48.1 ns     14575723 bytes_per_second=19.8447Mi/s
BM_format_to_n_string_span<char>/2                                      48.5 ns         48.5 ns     14428140 bytes_per_second=39.3396Mi/s
BM_format_to_n_string_span<char>/4                                      48.0 ns         48.0 ns     14559308 bytes_per_second=79.4032Mi/s
BM_format_to_n_string_span<char>/8                                      48.3 ns         48.3 ns     14497844 bytes_per_second=157.973Mi/s
BM_format_to_n_string_span<char>/16                                     48.5 ns         48.5 ns     14423850 bytes_per_second=314.497Mi/s
BM_format_to_n_string_span<char>/32                                     48.5 ns         48.5 ns     14436875 bytes_per_second=629.449Mi/s
BM_format_to_n_string_span<char>/64                                     48.5 ns         48.5 n…
@mordante mordante requested a review from a team as a code owner August 3, 2024 15:19
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Aug 3, 2024
@llvmbot
Copy link
Member

llvmbot commented Aug 3, 2024

@llvm/pr-subscribers-libcxx

Author: Mark de Wever (mordante)

Changes

__format_to_n_buffer is not used in the public library interface so the changes are not an ABI break.

Before
Benchmark Time CPU Time Old Time New CPU Old CPU New

BM_format_to_n_string_back_inserter<std::string>/1 -0.0160 -0.0136 59 58 59 58
BM_format_to_n_string_back_inserter<std::string>/2 +0.0020 +0.0044 58 59 58 59
BM_format_to_n_string_back_inserter<std::string>/4 +0.0084 +0.0109 58 59 58 59
BM_format_to_n_string_back_inserter<std::string>/8 -0.0014 +0.0014 59 59 58 59
BM_format_to_n_string_back_inserter<std::string>/16 -0.0042 -0.0018 59 58 59 58
BM_format_to_n_string_back_inserter<std::string>/32 -0.0136 -0.0112 78 77 78 77
BM_format_to_n_string_back_inserter<std::string>/64 -0.0096 -0.0072 78 77 77 77
BM_format_to_n_string_back_inserter<std::string>/128 -0.1486 -0.1465 91 77 91 77
BM_format_to_n_string_back_inserter<std::string>/256 -0.1215 -0.1191 102 90 102 90
BM_format_to_n_string_back_inserter<std::string>/512 -0.1412 -0.1391 158 136 158 136
BM_format_to_n_string_back_inserter<std::string>/1024 -0.1135 -0.1114 290 257 289 257
BM_format_to_n_string_back_inserter<std::string>/2048 -0.1551 -0.1530 489 413 488 413
BM_format_to_n_string_back_inserter<std::string>/4096 -0.1665 -0.1642 801 668 799 668
BM_format_to_n_string_back_inserter<std::string>/8192 -0.2301 -0.2282 1449 1116 1445 1116
BM_format_to_n_string_back_inserter<std::string>/16384 -0.1988 -0.1965 2942 2357 2933 2357
BM_format_to_n_string_back_inserter<std::string>/32768 -0.2129 -0.2109 5676 4467 5661 4467
BM_format_to_n_string_back_inserter<std::string>/65536 -0.2469 -0.2449 12437 9366 12404 9366
BM_format_to_n_string_back_inserter<std::string>/131072 -0.2294 -0.2274 25855 19923 25787 19923
BM_format_to_n_string_back_inserter<std::string>/262144 -0.1906 -0.1885 52880 42798 52739 42798
BM_format_to_n_string_back_inserter<std::string>/524288 -0.1898 -0.1876 107703 87261 107410 87257
BM_format_to_n_string_back_inserter<std::string>/1048576 -0.2162 -0.2139 231479 181427 230781 181426
BM_format_to_n_string_back_inserter<std::vector<char>>/1 -0.0035 -0.0007 72 72 72 72
BM_format_to_n_string_back_inserter<std::vector<char>>/2 +0.0104 +0.0128 73 73 72 73
BM_format_to_n_string_back_inserter<std::vector<char>>/4 -0.0022 +0.0003 74 74 74 74
BM_format_to_n_string_back_inserter<std::vector<char>>/8 +0.0092 +0.0116 75 76 75 76
BM_format_to_n_string_back_inserter<std::vector<char>>/16 -0.0019 +0.0005 79 79 79 79
BM_format_to_n_string_back_inserter<std::vector<char>>/32 +0.0168 +0.0195 89 90 88 90
BM_format_to_n_string_back_inserter<std::vector<char>>/64 -0.0077 -0.0054 91 90 90 90
BM_format_to_n_string_back_inserter<std::vector<char>>/128 -0.1628 -0.1608 109 91 109 91
BM_format_to_n_string_back_inserter<std::vector<char>>/256 -0.0994 -0.0971 120 108 119 108
BM_format_to_n_string_back_inserter<std::vector<char>>/512 -0.1116 -0.1095 186 165 186 165
BM_format_to_n_string_back_inserter<std::vector<char>>/1024 -0.1168 -0.1144 284 250 283 250
BM_format_to_n_string_back_inserter<std::vector<char>>/2048 -0.1664 -0.1644 484 404 483 404
BM_format_to_n_string_back_inserter<std::vector<char>>/4096 -0.2161 -0.2143 802 629 800 629
BM_format_to_n_string_back_inserter<std::vector<char>>/8192 -0.2834 -0.2817 1469 1053 1466 1053
BM_format_to_n_string_back_inserter<std::vector<char>>/16384 -0.2365 -0.2344 2700 2062 2693 2062
BM_format_to_n_string_back_inserter<std::vector<char>>/32768 -0.2359 -0.2341 4979 3805 4967 3805
BM_format_to_n_string_back_inserter<std::vector<char>>/65536 -0.2754 -0.2736 10431 7558 10405 7558
BM_format_to_n_string_back_inserter<std::vector<char>>/131072 -0.2505 -0.2487 22646 16973 22591 16973
BM_format_to_n_string_back_inserter<std::vector<char>>/262144 -0.1981 -0.1958 46278 37110 46148 37111
BM_format_to_n_string_back_inserter<std::vector<char>>/524288 -0.2027 -0.2011 91695 73110 91511 73108
BM_format_to_n_string_back_inserter<std::vector<char>>/1048576 -0.2367 -0.2348 195458 149194 194988 149197
BM_format_to_n_string_back_inserter<std::list<char>>/1 +0.0045 +0.0068 66 66 65 66
BM_format_to_n_string_back_inserter<std::list<char>>/2 +0.0068 +0.0092 79 79 79 79
BM_format_to_n_string_back_inserter<std::list<char>>/4 -0.0026 +0.0001 107 107 107 107
BM_format_to_n_string_back_inserter<std::list<char>>/8 +0.0498 +0.0523 171 180 171 180
BM_format_to_n_string_back_inserter<std::list<char>>/16 +0.0100 +0.0124 331 334 330 334
BM_format_to_n_string_back_inserter<std::list<char>>/32 +0.0320 +0.0345 641 662 640 662
BM_format_to_n_string_back_inserter<std::list<char>>/64 +0.0242 +0.0270 1237 1267 1233 1267
BM_format_to_n_string_back_inserter<std::list<char>>/128 +0.0025 +0.0047 2474 2480 2469 2480
BM_format_to_n_string_back_inserter<std::list<char>>/256 -0.0122 -0.0098 4984 4923 4972 4924
BM_format_to_n_string_back_inserter<std::list<char>>/512 +0.0074 +0.0098 9740 9812 9716 9811
BM_format_to_n_string_back_inserter<std::list<char>>/1024 +0.0045 +0.0072 19503 19590 19451 19591
BM_format_to_n_string_back_inserter<std::list<char>>/2048 +0.0021 +0.0046 39078 39161 38981 39159
BM_format_to_n_string_back_inserter<std::list<char>>/4096 -0.0002 +0.0023 78329 78316 78132 78315
BM_format_to_n_string_back_inserter<std::list<char>>/8192 +0.0001 +0.0026 156689 156709 156291 156699
BM_format_to_n_string_back_inserter<std::list<char>>/16384 -0.0025 +0.0004 313624 312842 312732 312842
BM_format_to_n_string_back_inserter<std::list<char>>/32768 -0.0009 +0.0017 630336 629744 628711 629751
BM_format_to_n_string_back_inserter<std::list<char>>/65536 -0.0029 -0.0001 1261542 1257851 1258055 1257872
BM_format_to_n_string_back_inserter<std::list<char>>/131072 -0.0047 -0.0016 2543001 2531022 2535000 2530835
BM_format_to_n_string_back_inserter<std::list<char>>/262144 -0.0061 -0.0017 5214390 5182786 5191608 5182661
BM_format_to_n_string_back_inserter<std::list<char>>/524288 -0.0079 -0.0040 10650366 10566644 10609616 10566709
BM_format_to_n_string_back_inserter<std::list<char>>/1048576 -0.0165 -0.0108 21677130 21319849 21550764 21318080
BM_format_to_n_string_begin<std::string>/1 -0.0931 -0.0909 54 49 54 49
BM_format_to_n_string_begin<std::string>/2 -0.0861 -0.0839 53 48 53 48
BM_format_to_n_string_begin<std::string>/4 -0.0872 -0.0847 53 49 53 49
BM_format_to_n_string_begin<std::string>/8 -0.0963 -0.0939 54 48 54 48
BM_format_to_n_string_begin<std::string>/16 -0.0969 -0.0947 54 48 54 48
BM_format_to_n_string_begin<std::string>/32 -0.1108 -0.1086 54 48 54 48
BM_format_to_n_string_begin<std::string>/64 -0.1107 -0.1086 54 48 54 48
BM_format_to_n_string_begin<std::string>/128 -0.2054 -0.2036 61 48 61 48
BM_format_to_n_string_begin<std::string>/256 -0.2768 -0.2751 69 50 69 50
BM_format_to_n_string_begin<std::string>/512 -0.4127 -0.4112 90 53 89 53
BM_format_to_n_string_begin<std::string>/1024 -0.5743 -0.5734 132 56 132 56
BM_format_to_n_string_begin<std::string>/2048 -0.7063 -0.7056 229 67 228 67
BM_format_to_n_string_begin<std::string>/4096 -0.7617 -0.7611 425 101 424 101
BM_format_to_n_string_begin<std::string>/8192 -0.8153 -0.8148 812 150 810 150
BM_format_to_n_string_begin<std::string>/16384 -0.8140 -0.8136 1656 308 1652 308
BM_format_to_n_string_begin<std::string>/32768 -0.5789 -0.5779 3179 1339 3171 1339
BM_format_to_n_string_begin<std::string>/65536 -0.5170 -0.5158 6818 3293 6802 3293
BM_format_to_n_string_begin<std::string>/131072 -0.5552 -0.5539 14829 6596 14788 6596
BM_format_to_n_string_begin<std::string>/262144 -0.5240 -0.5228 29547 14064 29471 14065
BM_format_to_n_string_begin<std::string>/524288 -0.5049 -0.5036 59436 29428 59284 29428
BM_format_to_n_string_begin<std::string>/1048576 -0.5123 -0.5110 120292 58666 119974 58666
BM_format_to_n_string_begin<std::vector<char>>/1 -0.0947 -0.0925 53 48 53 48
BM_format_to_n_string_begin<std::vector<char>>/2 -0.0859 -0.0834 53 48 53 48
BM_format_to_n_string_begin<std::vector<char>>/4 -0.0913 -0.0892 53 48 53 48
BM_format_to_n_string_begin<std::vector<char>>/8 -0.0808 -0.0786 52 48 52 48
BM_format_to_n_string_begin<std::vector<char>>/16 -0.0808 -0.0786 53 48 53 48
BM_format_to_n_string_begin<std::vector<char>>/32 -0.0921 -0.0899 53 48 53 48
BM_format_to_n_string_begin<std::vector<char>>/64 -0.0918 -0.0897 53 48 53 48
BM_format_to_n_string_begin<std::vector<char>>/128 -0.1769 -0.1747 59 48 59 48
BM_format_to_n_string_begin<std::vector<char>>/256 -0.3249 -0.3233 73 49 73 49
BM_format_to_n_string_begin<std::vector<char>>/512 -0.4552 -0.4539 97 53 96 53
BM_format_to_n_string_begin<std::vector<char>>/1024 -0.5978 -0.5969 138 56 138 56
BM_format_to_n_string_begin<std::vector<char>>/2048 -0.7152 -0.7144 235 67 235 67
BM_format_to_n_string_begin<std::vector<char>>/4096 -0.7780 -0.7775 439 98 438 98
BM_format_to_n_string_begin<std::vector<char>>/8192 -0.8230 -0.8226 853 151 851 151
BM_format_to_n_string_begin<std::vector<char>>/16384 -0.8065 -0.8060 1627 315 1623 315
BM_format_to_n_string_begin<std::vector<char>>/32768 -0.5823 -0.5811 3221 1345 3212 1345
BM_format_to_n_string_begin<std::vector<char>>/65536 -0.5351 -0.5340 7089 3295 7072 3295
BM_format_to_n_string_begin<std::vector<char>>/131072 -0.5683 -0.5672 15268 6591 15229 6590
BM_format_to_n_string_begin<std::vector<char>>/262144 -0.5351 -0.5339 30296 14084 30219 14084
BM_format_to_n_string_begin<std::vector<char>>/524288 -0.5061 -0.5049 61230 30239 61074 30238
BM_format_to_n_string_begin<std::vector<char>>/1048576 -0.5143 -0.5128 124101 60270 123704 60271
BM_format_to_n_string_begin<std::list<char>>/1 +0.0383 +0.0408 49 51 49 51
BM_format_to_n_string_begin<std::list<char>>/2 +0.0278 +0.0301 50 51 50 51
BM_format_to_n_string_begin<std::list<char>>/4 +0.0388 +0.0412 51 53 51 53
BM_format_to_n_string_begin<std::list<char>>/8 -0.0386 -0.0360 64 62 64 62
BM_format_to_n_string_begin<std::list<char>>/16 -0.0225 -0.0201 85 83 85 83
BM_format_to_n_string_begin<std::list<char>>/32 -0.0095 -0.0071 127 126 127 126
BM_format_to_n_string_begin<std::list<char>>/64 -0.0072 -0.0048 214 212 213 212
BM_format_to_n_string_begin<std::list<char>>/128 -0.0117 -0.0092 389 385 388 385
BM_format_to_n_string_begin<std::list<char>>/256 -0.0034 -0.0009 749 746 747 746
BM_format_to_n_string_begin<std::list<char>>/512 -0.0098 -0.0074 1453 1439 1449 1439
BM_format_to_n_string_begin<std::list<char>>/1024 +0.0109 +0.0132 2852 2883 2845 2882
BM_format_to_n_string_begin<std::list<char>>/2048 +0.0088 +0.0113 5685 5735 5671 5735
BM_format_to_n_string_begin<std::list<char>>/4096 +0.0043 +0.0068 11312 11360 11283 11360
BM_format_to_n_string_begin<std::list<char>>/8192 +0.0171 +0.0197 22644 23030 22586 23030
BM_format_to_n_string_begin<std::list<char>>/16384 +0.0146 +0.0172 45298 45959 45180 45958
BM_format_to_n_string_begin<std::list<char>>/32768 +0.0167 +0.0195 90351 91864 90110 91864
BM_format_to_n_string_begin<std::list<char>>/65536 +0.0150 +0.0180 180594 183305 180048 183298
BM_format_to_n_string_begin<std::list<char>>/131072 +0.0060 +0.0092 373023 375274 371863 375279
BM_format_to_n_string_begin<std::list<char>>/262144 -0.0354 -0.0318 895166 863452 891717 863366
BM_format_to_n_string_begin<std::list<char>>/524288 -0.0745 -0.0712 2209006 2044442 2201104 2044356
BM_format_to_n_string_begin<std::list<char>>/1048576 -0.0161 -0.0125 4421130 4349820 4404315 4349352
BM_format_to_n_string_span<char>/1 -0.0987 -0.0965 53 48 53 48
BM_format_to_n_string_span<char>/2 -0.0768 -0.0745 53 48 52 48
BM_format_to_n_string_span<char>/4 -0.0904 -0.0882 53 48 53 48
BM_format_to_n_string_span<char>/8 -0.0868 -0.0846 53 48 53 48
BM_format_to_n_string_span<char>/16 -0.0957 -0.0932 54 49 54 49
BM_format_to_n_string_span<char>/32 -0.0926 -0.0904 53 48 53 48
BM_format_to_n_string_span<char>/64 -0.0923 -0.0876 53 48 53 48
BM_format_to_n_string_span<char>/128 -0.1998 -0.1977 61 49 61 49
BM_format_to_n_string_span<char>/256 -0.2900 -0.2883 69 49 69 49
BM_format_to_n_string_span<char>/512 -0.4116 -0.4100 90 53 89 53
BM_format_to_n_string_span<char>/1024 -0.5854 -0.5844 134 56 134 56
BM_format_to_n_string_span<char>/2048 -0.7000 -0.6993 223 67 222 67
BM_format_to_n_string_span<char>/4096 -0.7731 -0.7725 427 97 426 97
BM_format_to_n_string_span<char>/8192 -0.8164 -0.8159 818 150 816 150
BM_format_to_n_string_span<char>/16384 -0.3453 -0.3436 1622 1062 1617 1062
BM_format_to_n_string_span<char>/32768 -0.5885 -0.5875 3137 1291 3129 1291
BM_format_to_n_string_span<char>/65536 -0.5064 -0.5052 6698 3306 6682 3306
BM_format_to_n_string_span<char>/131072 -0.5622 -0.5612 14925 6534 14888 6534
BM_format_to_n_string_span<char>/262144 -0.5215 -0.5201 29688 14207 29603 14207
BM_format_to_n_string_span<char>/524288 -0.4899 -0.4888 59308 30252 59180 30253
BM_format_to_n_string_span<char>/1048576 -0.4927 -0.4913 118765 60247 118433 60248
BM_format_to_n_string_pointer<char>/1 -0.0827 -0.0804 52 48 52 48
BM_format_to_n_string_pointer<char>/2 -0.0843 -0.0821 53 48 53 48
BM_format_to_n_string_pointer<char>/4 -0.0944 -0.0920 53 48 53 48
BM_format_to_n_string_pointer<char>/8 -0.0875 -0.0853 53 48 53 48
BM_format_to_n_string_pointer<char>/16 -0.0793 -0.0771 53 48 53 48
BM_format_to_n_string_pointer<char>/32 -0.0767 -0.0743 52 48 52 48
BM_format_to_n_string_pointer<char>/64 -0.0935 -0.0914 53 48 53 48
BM_format_to_n_string_pointer<char>/128 -0.2203 -0.2182 62 49 62 49
BM_format_to_n_string_pointer<char>/256 -0.2950 -0.2933 70 49 69 49
BM_format_to_n_string_pointer<char>/512 -0.4038 -0.4025 88 53 88 53
BM_format_to_n_string_pointer<char>/1024 -0.5755 -0.5745 131 56 131 56
BM_format_to_n_string_pointer<char>/2048 -0.7043 -0.7036 226 67 225 67
BM_format_to_n_string_pointer<char>/4096 -0.7726 -0.7719 426 97 425 97
BM_format_to_n_string_pointer<char>/8192 -0.8157 -0.8153 815 150 813 150
BM_format_to_n_string_pointer<char>/16384 -0.3490 -0.3473 1618 1053 1614 1053
BM_format_to_n_string_pointer<char>/32768 -0.5880 -0.5870 3137 1293 3129 1292
BM_format_to_n_string_pointer<char>/65536 -0.5062 -0.5048 6693 3305 6675 3305
BM_format_to_n_string_pointer<char>/131072 -0.5617 -0.5606 14912 6536 14876 6536
BM_format_to_n_string_pointer<char>/262144 -0.5206 -0.5194 29685 14230 29609 14230
BM_format_to_n_string_pointer<char>/524288 -0.4884 -0.4873 59254 30316 59133 30315
BM_format_to_n_string_pointer<char>/1048576 -0.4924 -0.4915 118746 60274 118523 60275


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

8 Files Affected:

  • (modified) libcxx/include/__format/buffer.h (+115-111)
  • (modified) libcxx/test/libcxx/transitive_includes/cxx03.csv (+1)
  • (modified) libcxx/test/libcxx/transitive_includes/cxx11.csv (+1)
  • (modified) libcxx/test/libcxx/transitive_includes/cxx14.csv (+1)
  • (modified) libcxx/test/libcxx/transitive_includes/cxx17.csv (+1)
  • (modified) libcxx/test/libcxx/transitive_includes/cxx20.csv (+2)
  • (modified) libcxx/test/libcxx/transitive_includes/cxx23.csv (+2)
  • (modified) libcxx/test/libcxx/transitive_includes/cxx26.csv (+2)
diff --git a/libcxx/include/__format/buffer.h b/libcxx/include/__format/buffer.h
index ccf79077dfa70..c41ea73b3eb7e 100644
--- a/libcxx/include/__format/buffer.h
+++ b/libcxx/include/__format/buffer.h
@@ -39,6 +39,7 @@
 #include <__type_traits/conditional.h>
 #include <__utility/exception_guard.h>
 #include <__utility/move.h>
+#include <climits> // LLVM-20 remove
 #include <cstddef>
 #include <stdexcept>
 #include <string_view>
@@ -56,6 +57,30 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 namespace __format {
 
+// A helper to limit the total size of code units written.
+class _LIBCPP_HIDE_FROM_ABI __max_output_size {
+public:
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI explicit __max_output_size(size_t __max_size) : __max_size_{__max_size} {}
+
+  // This function adjusts the size of a (bulk) write operations. It ensures the
+  // number of code units written by a __output_buffer never exceed
+  // __max_size_ code units.
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI size_t __write_request(size_t __code_units) {
+    size_t __result =
+        __code_units_written_ < __max_size_ ? std::min(__code_units, __max_size_ - __code_units_written_) : 0;
+    __code_units_written_ += __code_units;
+    return __result;
+  }
+
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI size_t __code_units_written() const noexcept { return __code_units_written_; }
+
+private:
+  size_t __max_size_;
+  // The code units that would have been written if there was no limit.
+  // format_to_n returns this value.
+  size_t __code_units_written_{0};
+};
+
 /// A "buffer" that handles writing to the proper iterator.
 ///
 /// This helper is used together with the @ref back_insert_iterator to offer
@@ -81,9 +106,6 @@ namespace __format {
 /// This class is ABI-tagged, still the new design does not change the size of
 /// objects of this class.
 ///
-/// The new design contains information regarding format_to_n changes, these
-/// will be implemented in follow-up patch.
-///
 /// The new design is the following.
 /// - There is an external object that connects the buffer to the output.
 /// - This buffer object:
@@ -189,12 +211,21 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
       : __ptr_(__ptr),
         __capacity_(__capacity),
         __flush_([](_CharT* __p, size_t __n, void* __o) { static_cast<_Tp*>(__o)->__flush(__p, __n); }),
-        __obj_(__obj) {}
+        __data_{.__version_llvm_20__ = false, .__obj_ = reinterpret_cast<uintptr_t>(__obj) >> 1} {}
 
   // New LLVM-20 function.
   [[nodiscard]]
   _LIBCPP_HIDE_FROM_ABI explicit __output_buffer(_CharT* __ptr, size_t __capacity, __prepare_write_type __prepare_write)
-      : __ptr_(__ptr), __capacity_(__capacity), __prepare_write_(__prepare_write), __obj_(nullptr) {}
+      : __output_buffer{__ptr, __capacity, __prepare_write, nullptr} {}
+
+  // New LLVM-20 function.
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI explicit __output_buffer(
+      _CharT* __ptr, size_t __capacity, __prepare_write_type __prepare_write, __max_output_size* __max_output_size)
+      : __ptr_(__ptr),
+        __capacity_(__capacity),
+        __prepare_write_(__prepare_write),
+        __data_{.__version_llvm_20_ = true, .__max_output_size_ = reinterpret_cast<uintptr_t>(__max_output_size) >> 1} {
+  }
 
   // Deprecated LLVM-19 function.
   _LIBCPP_HIDE_FROM_ABI void __reset(_CharT* __ptr, size_t __capacity) {
@@ -215,6 +246,10 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
 
   // Used in std::back_insert_iterator.
   _LIBCPP_HIDE_FROM_ABI void push_back(_CharT __c) {
+    if (__data_.__version_llvm_20_ && __data_.__max_output_size_ &&
+        reinterpret_cast<__max_output_size*>(__data_.__max_output_size_ << 1)->__write_request(1) == 0)
+      return;
+
     __ptr_[__size_++] = __c;
 
     // Profiling showed flushing after adding is more efficient than flushing
@@ -241,6 +276,11 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
     // upper case. For integral these strings are short.
     // TODO FMT Look at the improvements above.
     size_t __n = __str.size();
+    if (__data_.__version_llvm_20_ && __data_.__max_output_size_) {
+      __n = reinterpret_cast<__max_output_size*>(__data_.__max_output_size_ << 1)->__write_request(__n);
+      if (__n == 0)
+        return;
+    }
 
     __flush_on_overflow(__n);
     if (__n < __capacity_) { // push_back requires the buffer to have room for at least one character (so use <).
@@ -273,6 +313,12 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
     _LIBCPP_ASSERT_INTERNAL(__first <= __last, "not a valid range");
 
     size_t __n = static_cast<size_t>(__last - __first);
+    if (__data_.__version_llvm_20_ && __data_.__max_output_size_) {
+      __n = reinterpret_cast<__max_output_size*>(__data_.__max_output_size_ << 1)->__write_request(__n);
+      if (__n == 0)
+        return;
+    }
+
     __flush_on_overflow(__n);
     if (__n < __capacity_) { //  push_back requires the buffer to have room for at least one character (so use <).
       std::transform(__first, __last, std::addressof(__ptr_[__size_]), std::move(__operation));
@@ -295,6 +341,12 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
 
   /// A \c fill_n wrapper.
   _LIBCPP_HIDE_FROM_ABI void __fill(size_t __n, _CharT __value) {
+    if (__data_.__version_llvm_20_ && __data_.__max_output_size_) {
+      __n = reinterpret_cast<__max_output_size*>(__data_.__max_output_size_ << 1)->__write_request(__n);
+      if (__n == 0)
+        return;
+    }
+
     __flush_on_overflow(__n);
     if (__n < __capacity_) { //  push_back requires the buffer to have room for at least one character (so use <).
       std::fill_n(std::addressof(__ptr_[__size_]), __n, __value);
@@ -315,9 +367,9 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
   }
 
   _LIBCPP_HIDE_FROM_ABI void __flush(size_t __size_hint) {
-    if (__obj_) {
+    if (!__data_.__version_llvm_20_) {
       // LLVM-19 code path
-      __flush_(__ptr_, __size_, __obj_);
+      __flush_(__ptr_, __size_, reinterpret_cast<void*>(__data_.__obj_ << 1));
       __size_ = 0;
     } else {
       // LLVM-20 code path
@@ -340,7 +392,20 @@ class _LIBCPP_TEMPLATE_VIS __output_buffer {
   };
   static_assert(sizeof(__flush_) == sizeof(__prepare_write_), "The union is an ABI break.");
   static_assert(alignof(decltype(__flush_)) == alignof(decltype(__prepare_write_)), "The union is an ABI break.");
-  void* __obj_;
+  // Note this code is quite ugly, but it can cleaned up once the LLVM-19 parts
+  // of the code are removed.
+  union {
+    struct {
+      uintptr_t __version_llvm_20__ : 1;
+      uintptr_t __obj_ : CHAR_BIT * sizeof(void*) - 1;
+    };
+    struct {
+      uintptr_t __version_llvm_20_ : 1;
+      uintptr_t __max_output_size_ : CHAR_BIT * sizeof(__max_output_size*) - 1;
+    };
+  } __data_;
+  static_assert(sizeof(__data_) == sizeof(void*), "The struct is an ABI break.");
+  static_assert(alignof(decltype(__data_)) == alignof(void*), "The struct is an ABI break.");
 
   /// Flushes the buffer when the output operation would overflow the buffer.
   ///
@@ -560,105 +625,6 @@ class _LIBCPP_TEMPLATE_VIS __formatted_size_buffer {
   size_t __size_{0};
 };
 
-/// The base of a buffer that counts and limits the number of insertions.
-template <class _OutIt, __fmt_char_type _CharT, bool>
-  requires(output_iterator<_OutIt, const _CharT&>)
-struct _LIBCPP_TEMPLATE_VIS __format_to_n_buffer_base {
-  using _Size = iter_difference_t<_OutIt>;
-
-public:
-  _LIBCPP_HIDE_FROM_ABI explicit __format_to_n_buffer_base(_OutIt __out_it, _Size __max_size)
-      : __writer_(std::move(__out_it)), __max_size_(std::max(_Size(0), __max_size)) {}
-
-  _LIBCPP_HIDE_FROM_ABI void __flush(_CharT* __ptr, size_t __n) {
-    if (_Size(__size_) <= __max_size_)
-      __writer_.__flush(__ptr, std::min(_Size(__n), __max_size_ - __size_));
-    __size_ += __n;
-  }
-
-protected:
-  __internal_storage<_CharT> __storage_;
-  __output_buffer<_CharT> __output_{__storage_.__begin(), __storage_.__buffer_size, this};
-  typename __writer_selector<_OutIt, _CharT>::type __writer_;
-
-  _Size __max_size_;
-  _Size __size_{0};
-};
-
-/// The base of a buffer that counts and limits the number of insertions.
-///
-/// This version is used when \c __enable_direct_output<_OutIt, _CharT> == true.
-///
-/// This class limits the size available to the direct writer so it will not
-/// exceed the maximum number of code units.
-template <class _OutIt, __fmt_char_type _CharT>
-  requires(output_iterator<_OutIt, const _CharT&>)
-class _LIBCPP_TEMPLATE_VIS __format_to_n_buffer_base<_OutIt, _CharT, true> {
-  using _Size = iter_difference_t<_OutIt>;
-
-public:
-  _LIBCPP_HIDE_FROM_ABI explicit __format_to_n_buffer_base(_OutIt __out_it, _Size __max_size)
-      : __output_(std::__unwrap_iter(__out_it), __max_size, this),
-        __writer_(std::move(__out_it)),
-        __max_size_(__max_size) {
-    if (__max_size <= 0) [[unlikely]]
-      __output_.__reset(__storage_.__begin(), __storage_.__buffer_size);
-  }
-
-  _LIBCPP_HIDE_FROM_ABI void __flush(_CharT* __ptr, size_t __n) {
-    // A __flush to the direct writer happens in the following occasions:
-    // - The format function has written the maximum number of allowed code
-    //   units. At this point it's no longer valid to write to this writer. So
-    //   switch to the internal storage. This internal storage doesn't need to
-    //   be written anywhere so the __flush for that storage writes no output.
-    // - Like above, but the next "mass write" operation would overflow the
-    //   buffer. In that case the buffer is pre-emptively switched. The still
-    //   valid code units will be written separately.
-    // - The format_to_n function is finished. In this case there's no need to
-    //   switch the buffer, but for simplicity the buffers are still switched.
-    // When the __max_size <= 0 the constructor already switched the buffers.
-    if (__size_ == 0 && __ptr != __storage_.__begin()) {
-      __writer_.__flush(__ptr, __n);
-      __output_.__reset(__storage_.__begin(), __storage_.__buffer_size);
-    } else if (__size_ < __max_size_) {
-      // Copies a part of the internal buffer to the output up to n characters.
-      // See __output_buffer<_CharT>::__flush_on_overflow for more information.
-      _Size __s = std::min(_Size(__n), __max_size_ - __size_);
-      std::copy_n(__ptr, __s, __writer_.__out_it());
-      __writer_.__flush(__ptr, __s);
-    }
-
-    __size_ += __n;
-  }
-
-protected:
-  __internal_storage<_CharT> __storage_;
-  __output_buffer<_CharT> __output_;
-  __writer_direct<_OutIt, _CharT> __writer_;
-
-  _Size __max_size_;
-  _Size __size_{0};
-};
-
-/// The buffer that counts and limits the number of insertions.
-template <class _OutIt, __fmt_char_type _CharT>
-  requires(output_iterator<_OutIt, const _CharT&>)
-struct _LIBCPP_TEMPLATE_VIS __format_to_n_buffer final
-    : public __format_to_n_buffer_base< _OutIt, _CharT, __enable_direct_output<_OutIt, _CharT>> {
-  using _Base = __format_to_n_buffer_base<_OutIt, _CharT, __enable_direct_output<_OutIt, _CharT>>;
-  using _Size = iter_difference_t<_OutIt>;
-
-public:
-  _LIBCPP_HIDE_FROM_ABI explicit __format_to_n_buffer(_OutIt __out_it, _Size __max_size)
-      : _Base(std::move(__out_it), __max_size) {}
-  _LIBCPP_HIDE_FROM_ABI auto __make_output_iterator() { return this->__output_.__make_output_iterator(); }
-
-  _LIBCPP_HIDE_FROM_ABI format_to_n_result<_OutIt> __result() && {
-    this->__output_.__flush(0);
-    return {std::move(this->__writer_).__out_it(), this->__size_};
-  }
-};
-
 // ***** ***** ***** LLVM-20 classes ***** ***** *****
 
 // A dynamically growing buffer.
@@ -668,8 +634,11 @@ class _LIBCPP_TEMPLATE_VIS __allocating_buffer : public __output_buffer<_CharT>
   __allocating_buffer(const __allocating_buffer&)            = delete;
   __allocating_buffer& operator=(const __allocating_buffer&) = delete;
 
-  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI __allocating_buffer()
-      : __output_buffer<_CharT>{__buffer_, __buffer_size_, __prepare_write} {}
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI __allocating_buffer() : __allocating_buffer{nullptr} {}
+
+  [[nodiscard]]
+  _LIBCPP_HIDE_FROM_ABI explicit __allocating_buffer(__max_output_size* __max_output_size)
+      : __output_buffer<_CharT>{__buffer_, __buffer_size_, __prepare_write, __max_output_size} {}
 
   _LIBCPP_HIDE_FROM_ABI ~__allocating_buffer() {
     if (__ptr_ != __buffer_) {
@@ -690,6 +659,7 @@ class _LIBCPP_TEMPLATE_VIS __allocating_buffer : public __output_buffer<_CharT>
   // its capacity is exceeded a dynamic buffer will be allocated.
   static constexpr size_t __buffer_size_ = 256;
   _CharT __buffer_[__buffer_size_];
+
   _CharT* __ptr_{__buffer_};
 
   _LIBCPP_HIDE_FROM_ABI void __grow_buffer(size_t __capacity) {
@@ -729,7 +699,12 @@ template <class _OutIt, __fmt_char_type _CharT>
 class _LIBCPP_TEMPLATE_VIS __direct_iterator_buffer : public __output_buffer<_CharT> {
 public:
   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI explicit __direct_iterator_buffer(_OutIt __out_it)
-      : __output_buffer<_CharT>{std::__unwrap_iter(__out_it), __buffer_size, __prepare_write}, __out_it_(__out_it) {}
+      : __direct_iterator_buffer{__out_it, nullptr} {}
+
+  [[nodiscard]]
+  _LIBCPP_HIDE_FROM_ABI explicit __direct_iterator_buffer(_OutIt __out_it, __max_output_size* __max_output_size)
+      : __output_buffer<_CharT>{std::__unwrap_iter(__out_it), __buffer_size, __prepare_write, __max_output_size},
+        __out_it_(__out_it) {}
 
   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI _OutIt __out_it() && { return __out_it_ + this->__size(); }
 
@@ -753,7 +728,12 @@ template <class _OutIt, __fmt_char_type _CharT>
 class _LIBCPP_TEMPLATE_VIS __container_inserter_buffer : public __output_buffer<_CharT> {
 public:
   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI explicit __container_inserter_buffer(_OutIt __out_it)
-      : __output_buffer<_CharT>{__buffer_, __buffer_size, __prepare_write}, __container_{__out_it.__get_container()} {}
+      : __container_inserter_buffer{__out_it, nullptr} {}
+
+  [[nodiscard]]
+  _LIBCPP_HIDE_FROM_ABI explicit __container_inserter_buffer(_OutIt __out_it, __max_output_size* __max_output_size)
+      : __output_buffer<_CharT>{__buffer_, __buffer_size, __prepare_write, __max_output_size},
+        __container_{__out_it.__get_container()} {}
 
   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI auto __out_it() && {
     __container_->insert(__container_->end(), __buffer_, __buffer_ + this->__size());
@@ -791,6 +771,9 @@ class _LIBCPP_TEMPLATE_VIS __iterator_buffer : public __allocating_buffer<_CharT
   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI explicit __iterator_buffer(_OutIt __out_it)
       : __allocating_buffer<_CharT>{}, __out_it_{std::move(__out_it)} {}
 
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI explicit __iterator_buffer(_OutIt __out_it, __max_output_size* __max_output_size)
+      : __allocating_buffer<_CharT>{__max_output_size}, __out_it_{std::move(__out_it)} {}
+
   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI auto __out_it() && {
     return std::ranges::copy(this->__view(), std::move(__out_it_)).out;
   }
@@ -813,6 +796,27 @@ class _LIBCPP_TEMPLATE_VIS __buffer_selector {
                                   __iterator_buffer<_OutIt, _CharT>>>;
 };
 
+// A buffer that counts and limits the number of insertions.
+template <class _OutIt, __fmt_char_type _CharT>
+class _LIBCPP_TEMPLATE_VIS __format_to_n_buffer : private __buffer_selector<_OutIt, _CharT>::type {
+public:
+  using _Base = __buffer_selector<_OutIt, _CharT>::type;
+
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI __format_to_n_buffer(_OutIt __out_it, iter_difference_t<_OutIt> __n)
+      : _Base{std::move(__out_it), std::addressof(__max_output_size_)},
+        __max_output_size_{__n < 0 ? size_t{0} : static_cast<size_t>(__n)} {}
+
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI auto __make_output_iterator() { return _Base::__make_output_iterator(); }
+
+  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI format_to_n_result<_OutIt> __result() && {
+    return {static_cast<_Base&&>(*this).__out_it(),
+            static_cast<iter_difference_t<_OutIt>>(__max_output_size_.__code_units_written())};
+  }
+
+private:
+  __max_output_size __max_output_size_;
+};
+
 // ***** ***** ***** LLVM-19 and LLVM-20 class ***** ***** *****
 
 // A dynamically growing buffer intended to be used for retargeting a context.
diff --git a/libcxx/test/libcxx/transitive_includes/cxx03.csv b/libcxx/test/libcxx/transitive_includes/cxx03.csv
index 622fced5ffa40..f6e7db17f413f 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx03.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx03.csv
@@ -860,6 +860,7 @@ thread atomic
 thread cctype
 thread cerrno
 thread chrono
+thread climits
 thread clocale
 thread compare
 thread cstddef
diff --git a/libcxx/test/libcxx/transitive_includes/cxx11.csv b/libcxx/test/libcxx/transitive_includes/cxx11.csv
index 11c3c1322c406..752fea058e63b 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx11.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx11.csv
@@ -867,6 +867,7 @@ thread atomic
 thread cctype
 thread cerrno
 thread chrono
+thread climits
 thread clocale
 thread compare
 thread cstddef
diff --git a/libcxx/test/libcxx/transitive_includes/cxx14.csv b/libcxx/test/libcxx/transitive_includes/cxx14.csv
index 666d5c3896467..010f7e2fb82e9 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx14.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx14.csv
@@ -870,6 +870,7 @@ thread atomic
 thread cctype
 thread cerrno
 thread chrono
+thread climits
 thread clocale
 thread compare
 thread cstddef
diff --git a/libcxx/test/libcxx/transitive_includes/cxx17.csv b/libcxx/test/libcxx/transitive_includes/cxx17.csv
index 3a3aa5a894473..64c2db3eef6f9 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx17.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx17.csv
@@ -881,6 +881,7 @@ thread atomic
 thread cctype
 thread cerrno
 thread chrono
+thread climits
 thread clocale
 thread compare
 thread cstddef
diff --git a/libcxx/test/libcxx/transitive_includes/cxx20.csv b/libcxx/test/libcxx/transitive_includes/cxx20.csv
index 982c2013e3417..a7ea7f8dddbea 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx20.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx20.csv
@@ -276,6 +276,7 @@ filesystem version
 format array
 format cctype
 format cerrno
+format climits
 format clocale
 format cmath
 format cstddef
@@ -896,6 +897,7 @@ thread array
 thread atomic
 thread cctype
 thread cerrno
+thread climits
 thread clocale
 thread compare
 thread cstddef
diff --git a/libcxx/test/libcxx/transitive_includes/cxx23.csv b/libcxx/test/libcxx/transitive_includes/cxx23.csv
index 8ffb71d8b566b..a7310f20125b9 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx23.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx23.csv
@@ -180,6 +180,7 @@ filesystem version
 format array
 format cctype
 format cerrno
+format climits
 format clocale
 format cmath
 format cstddef
@@ -616,6 +617,7 @@ thread array
 thread atomic
 thread cctype
 thread cerrno
+thread climits
 thread clocale
 thread compare
 thread cstddef
diff --git a/libcxx/test/libcxx/transitive_includes/cxx26.csv b/libcxx/test/libcxx/transitive_includes/cxx26.csv
index 8ffb71d8b566b..a7310f20125b9 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx26.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx26.csv
@@ -180,6 +180,7 @@ filesystem version
 format array
 format cctype
 format cerrno
+format climits
 format clocale
 format cmath
 format cstddef
@@ -616,6 +617,7 @@ thread array
 thread atomic
 thread cctype
 thread cerrno
+thread climits
 thread clocale
 thread compare
 thread cstddef

[[nodiscard]] _LIBCPP_HIDE_FROM_ABI explicit __max_output_size(size_t __max_size) : __max_size_{__max_size} {}

// This function adjusts the size of a (bulk) write operations. It ensures the
// number of code units written by a __output_buffer never exceed
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// number of code units written by a __output_buffer never exceed
// number of code units written by a __output_buffer never exceeds

@mordante
Copy link
Member Author

Abandoned, done in a different patch.

@mordante mordante closed this Jan 25, 2025
@mordante mordante deleted the users/mordante/format_performance__format_to_n branch January 25, 2025 16:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants