toke.c op.c : rmv 2nd realloc() when cat()ing HEK + "::" + PV #23414
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
newSVhek(), followed by 1 total length sv_grow() call, then sv_cathek() sv_catpvs() sv_cathek() still had perf issues after benchmarking, so final commit switched to never having a SV COW exist in the first place. The slowness of S_sv_uncow() can't be prevented because the 1st malloc() block it gets is "right fitted" tight or perfectly to the HEK's length, forcing a realloc() to execute few lines later inside sv_grow(). __rdtsc() "CPU ticks" benchmarks are at the end but collapsed.
Original commit message
newSVhek(stashname) creates a SV* POK HEK* COW. At the start, sv_catpvs(sym, "::"); will de-COW it (malloc). Then sv_catpvs(sym, "::"); will SvGROW(SvCUR() + 2); it (realloc).
Then later on sv_catpvn(sym, d+1, cat_len) will SvGROW(SvCUR() + cat_len) it (realloc) a 2nd time.
Prevent this by calculating the guess-timate or final SvCUR() length of the dest SV* ahead of time.
Any inefficiencies or flaws inside sv_grow() or S_sv_uncow(), are outside the scope of this commit.
benchmarks:
dt4=1209 232 138 312 total=1891
dt4=1394 691 447 180 total=2712
dt4=1156 673 350 177 total=2356
dt4=1550 720 394 218 total=2882
dt4=1497 773 300 168 total=2738
dt4=1591 612 332 194 total=2729
dt4=1279 700 315 164 total=2458
dt4=2500 644 403 191 total=3738
dt4=1218 250 159 188 total=1815
dt4=1241 753 259 132 total=2385
dt4=1159 321 200 214 total=1894
dt4=1344 1565 185 300 total=3394
dt4=2373 777 341 185 total=3676
dt4=2571 732 327 141 total=3771
dt4=1262 329 206 271 total=2068
dt4=1465 1109 156 285 total=3015
dt4=1185 288 212 235 total=1920
dt4=1265 932 147 209 total=2553
dt4=1385 891 200 197 total=2673
dt4=2194 309 385 171 total=3059
dt4=1706 383 394 182 total=2665
dt4=1497 315 229 200 total=2241
dt4=2106 482 365 150 total=3103
dt4=1615 362 191 241 total=2409
dt4=5538 382 297 215 total=6432
dt4=1138 341 144 227 total=1850
dt4=1659 388 191 277 total=2515
dt4=5582 353 180 273 total=6388
dt4=5206 530 229 294 total=6259
dt4=1559 394 306 162 total=2421
dt4=1676 418 600 144 total=2838
dt4=1197 750 688 162 total=2797
dt4=3109 368 241 153 total=3871
dt4=5750 327 188 200 total=6465
dt4=1391 486 147 206 total=2230
dt4=1691 315 288 173 total=2467
dt4=1000 420 141 230 total=1791
dt4=1459 526 312 223 total=2520
dt4=1294 365 315 191 total=2165
dt4=1300 612 244 209 total=2365
dt4=1124 382 359 200 total=2065
dt4=1383 491 170 177 total=2221
dt4=1400 303 221 229 total=2153
dt4=1506 412 365 182 total=2465
dt4=1942 361 180 206 total=2689
dt4=1253 288 147 289 total=1977
dt4=927 311 253 197 total=1688
dt4=4723 824 188 247 total=5982
dt4=1412 400 341 194 total=2347
dt4=1659 576 300 197 total=2732
dt4=1189 285 323 262 total=2059
dt4=1547 885 327 217 total=2976
dt4=1394 729 324 217 total=2664
dt4=1562 709 217 203 total=2691
dt4=1632 838 362 194 total=3026
dt4=1426 647 274 247 total=2594
dt4=1235 677 285 156 total=2353
dt4=2315 706 262 191 total=3474
dt4=1332 259 153 224 total=1968
dt4=1286 682 300 224 total=2492
dt4=1341 379 215 212 total=2147
dt4=1391 741 215 294 total=2641
dt4=2279 809 341 206 total=3635
dt4=2780 735 194 241 total=3950
dt4=1000 229 168 191 total=1588
dt4=1274 1082 424 232 total=3012
dt4=1103 321 176 171 total=1771
dt4=1380 920 200 159 total=2659
dt4=1309 923 344 142 total=2718
dt4=2214 683 185 191 total=3273
dt4=2785 621 311 224 total=3941
dt4=1688 347 300 203 total=2538
dt4=2068 653 379 215 total=3315
dt4=1800 582 350 227 total=2959
dt4=7203 815 329 168 total=8515
dt4=1189 282 185 215 total=1871
dt4=2988 797 303 176 total=4264
dt4=5759 1265 332 150 total=7506
dt4=6492 629 362 167 total=7650
dt4=2027 744 323 153 total=3247
dt4=2880 761 368 144 total=4153
dt4=1288 1094 374 173 total=2929
dt4=3485 1324 423 183 total=5415
dt4=7500 823 268 150 total=8741
dt4=2850 1270 177 241 total=4538
dt4=1632 838 303 191 total=2964
dt4=923 283 150 238 total=1594
dt4=1232 674 191 209 total=2306
dt4=1373 833 367 206 total=2779
dt4=1473 603 462 174 total=2712
dt4=1209 347 197 312 total=2065
dt4=1647 629 238 227 total=2741
dt4=1514 303 150 224 total=2191
dt4=1541 706 335 159 total=2741
dt4=1192 617 262 121 total=2192
dt4=1238 271 194 268 total=1971
dt4=1121 335 247 294 total=1997
dt4=4318 653 194 318 total=5483
dt4=1965 688 418 176 total=3247
dt4=1168 335 285 215 total=2003
dt4=1203 291 294 244 total=2032
dt4=927 1100 297 141 total=2465
dt4=1647 623 315 182 total=2767
dt4=1124 803 320 227 total=2474
dt4=1394 882 174 200 total=2650
dt4=1406 1194 191 230 total=3021
dt4=1568 641 191 215 total=2615
dt4=2262 682 168 247 total=3359
dt4=1130 300 176 241 total=1847
dt4=1403 777 197 235 total=2612
dt4=1139 261 203 200 total=1803
dt4=1253 871 247 256 total=2627
dt4=3000 779 932 130 total=4841
dt4=2944 1321 197 229 total=4691
dt4=1535 256 168 256 total=2215
dt4=1653 1406 162 270 total=3491
dt4=1167 268 159 256 total=1850
dt4=1074 2309 185 215 total=3783
dt4=1532 591 221 247 total=2591
dt4=2906 638 174 291 total=4009
dt4=3035 832 297 183 total=4347
dt4=1388 338 259 212 total=2197
dt4=3059 753 320 197 total=4329
dt4=1930 541 206 276 total=2953
dt4=5900 835 385 180 total=7300
dt4=1303 297 191 806 total=2597
dt4=2732 935 377 223 total=4267
dt4=7159 1670 394 109 total=9332
dt4=6880 1044 326 159 total=8409
dt4=1812 794 338 197 total=3141
dt4=3465 1000 300 197 total=4962
dt4=1641 880 291 244 total=3056
dt4=3074 1553 153 197 total=4977
dt4=6968 1426 312 203 total=8909
dt4=2336 820 180 235 total=3571
dt4=1421 903 250 197 total=2771
dt4=1465 282 174 182 total=2103
dt4=1518 673 309 218 total=2718
dt4=1415 747 356 215 total=2733
dt4=1614 521 338 206 total=2679
dt4=1133 323 247 227 total=1930
dt4=1321 1067 197 218 total=2803
dt4=1532 327 294 206 total=2359
dt4=1530 753 188 191 total=2662
dt4=1691 335 324 144 total=2494
dt4=1274 253 147 288 total=1962
dt4=1409 470 159 312 total=2350
dt4=5797 994 188 244 total=7223
dt4=1897 421 191 232 total=2741
dt4=1244 303 571 182 total=2300
dt4=1865 341 268 159 total=2633
dt4=5321 488 335 212 total=6356
dt4=1017 418 153 206 total=1794
dt4=1297 276 330 209 total=2112
dt4=1915 312 206 226 total=2659
dt4=1283 344 309 197 total=2133
dt4=1059 341 273 224 total=1897
dt4=2100 271 185 227 total=2783
dt4=1494 500 191 191 total=2376
dt4=1627 506 170 177 total=2480
dt4=1400 524 232 153 total=2309
dt4=1471 179 150 174 total=1974
dt4=2197 418 312 144 total=3071
dt4=1853 388 368 226 total=2835
dt4=1238 315 153 214 total=1920
dt4=1847 565 194 279 total=2885
dt4=1142 220 171 232 total=1765
dt4=1074 285 144 215 total=1718
dt4=1127 273 130 212 total=1742
dt4=2047 441 186 223 total=2897
dt4=1517 712 180 185 total=2594
dt4=1230 626 227 214 total=2297
dt4=4606 483 217 227 total=5533
dt4=1250 368 173 233 total=2024
dt4=1447 350 306 173 total=2276
dt4=1265 338 321 238 total=2162
dt4=1033 314 174 300 total=1821
dt4=1685 268 256 320 total=2529
dt4=1120 309 859 244 total=2532
dt4=1320 271 326 253 total=2170
dt4=1676 341 200 191 total=2408
dt4=1291 365 179 244 total=2079
dt4=1321 350 268 303 total=2242
dt4=1297 321 285 177 total=2080
dt4=1174 582 321 232 total=2309
decow
newSVhek() + sv_grow() + sv_catpvs("::")
decowing is column 2, 3 is sv_catpvs("::")
dt4=968 3068 473 224 total=4733
dt4=703 2944 212 235 total=4094
dt4=753 2264 265 274 total=3556
dt4=1191 9250 721 241 total=11403
dt4=1471 3100 191 229 total=4991
dt4=2433 14211 830 238 total=17712
dt4=1282 5185 724 285 total=7476
dt4=1515 3961 718 209 total=6403
dt4=897 4217 615 262 total=5991
dt4=659 2209 171 217 total=3256
dt4=982 73550 1168 341 total=76041
dt4=829 2680 232 244 total=3985
dt4=477 2276 271 250 total=3274
dt4=1550 2591 644 244 total=5029
dt4=1030 7226 909 212 total=9377
dt4=1488 2430 300 217 total=4435
dt4=568 2164 709 274 total=3715
dt4=570 3680 291 259 total=4800
dt4=1685 3332 386 1088908 total=1094311
dt4=1671 5147 773 259 total=7850
dt4=1014 3889 1047 323 total=6273
dt4=844 2259 456 232 total=3791
dt4=888 4076 1006 303 total=6273
dt4=380 2270 415 215 total=3280
dt4=685 2418 558 1650 total=5311
dt4=756 2132 609 276 total=3773
dt4=1659 4314 615 341 total=6929
dt4=1336 3514 633 194 total=5677
dt4=1003 1947 379 1056 total=4385
dt4=738 2497 536 1276 total=5047
dt4=624 2491 1597 2000 total=6712
dt4=503 2115 1153 1923 total=5694
dt4=662 2559 558 1842 total=5621
dt4=811 2318 600 1782 total=5511
dt4=1165 2229 518 1688 total=5600
dt4=703 2432 435 289 total=3859
dt4=573 2588 315 1185 total=4661
dt4=794 4271 791 212 total=6068
dt4=829 4277 676 236 total=6018
dt4=1006 3521 508 1483 total=6518
dt4=1268 4765 758 433 total=7224
dt4=882 4650 771 291 total=6594
dt4=794 3121 956 191 total=5062
dt4=709 3644 735 274 total=5362
dt4=918 4441 659 238 total=6256
dt4=721 4273 1956 503 total=7453
dt4=644 2727 262 323 total=3956
dt4=1109 2735 250 235 total=4329
dt4=759 2556 288 321 total=3924
newSVhek() + sv_grow() + unsafe Copy()
dt4=356 2826 112 226 total=3520
dt4=432 5806 359 135 total=6732
dt4=659 4464 203 230 total=5556
dt4=359 2818 244 303 total=3724
dt4=206 2230 82 318 total=2836
dt4=444 4600 183 153 total=5380
dt4=735 5756 403 138 total=7032
dt4=250 2456 123 424 total=3253
dt4=550 2368 591 188 total=3697
dt4=238 2436 97 400 total=3171
dt4=194 1688 94 383 total=2359
dt4=174 1165 85 232 total=1656
dt4=221 1279 82 509 total=2091
dt4=376 2700 168 229 total=3473
dt4=279 2815 135 218 total=3447
dt4=180 2223 168 382 total=2953
dt4=241 1871 100 435 total=2647
dt4=300 1094 82 180 total=1656
dt4=303 1126 71 332 total=1832
dt4=215 1382 100 238 total=1935
dt4=324 3391 97 409 total=4221
dt4=112 1573 165 182 total=2032
dt4=597 4138 179 530 total=5444
dt4=203 1361 121 247 total=1932
dt4=432 2274 144 550 total=3400
dt4=335 2391 130 420 total=3276
dt4=177 1156 97 197 total=1627
dt4=265 1171 70 324 total=1830
dt4=327 1211 83 532 total=2153
dt4=241 815 94 179 total=1329
dt4=421 1321 70 324 total=2136
dt4=262 1338 73 256 total=1929
dt4=617 797 50 280 total=1744
dt4=756 1565 88 1009 total=3418
dt4=829 5200 94 571 total=6694
dt4=586 1147 59 700 total=2492
dt4=415 1453 53 397 total=2318
dt4=453 2397 80 450 total=3380
dt4=612 1206 73 1309 total=3200
dt4=265 791 73 762 total=1891
dt4=1229 3253 112 776 total=5370
dt4=488 5282 97 733 total=6600
dt4=347 732 115 853 total=2047
dt4=433 1064 80 864 total=2441
dt4=306 1085 68 241 total=1700
dt4=932 2368 123 480 total=3903
dt4=1047 2538 109 444 total=4138
dt4=556 2876 153 415 total=4000
dt4=482 3262 112 276 total=4132
dt4=432 2632 115 241 total=3420
dt4=412 1568 91 685 total=2756
dt4=341 1583 97 429 total=2450
dt4=382 1088 88 250 total=1808
dt4=700 2953 362 364 total=4379
dt4=268 1544 82 209 total=2103
dt4=253 1476 71 232 total=2032
dt4=303 1277 82 238 total=1900
dt4=338 3812 165 338 total=4653
dt4=350 1809 88 415 total=2662
dt4=382 1330 111 321 total=2144
dt4=727 6635 106 447 total=7915
dt4=424 1150 62 300 total=1936
dt4=414 2824 250 732 total=4220
dt4=626 1953 74 732 total=3385
dt4=474 1144 62 220 total=1900
dt4=629 3397 438 580 total=5044
dt4=356 1514 65 471 total=2406
dt4=241 1220 62 197 total=1720
dt4=550 4103 288 709 total=5650
dt4=356 929 65 635 total=1985
dt4=300 1162 73 1065 total=2600
dt4=470 1283 73 353 total=2179
dt4=333 1344 73 333 total=2083
dt4=259 1144 65 264 total=1732
dt4=468 2838 150 426 total=3882
dt4=238 1491 97 177 total=2003
dt4=297 1244 91 168 total=1800
dt4=174 1282 97 218 total=1771
dt4=347 2571 147 279 total=3344
dt4=212 1253 67 194 total=1726
dt4=412 1176 68 309 total=1965
dt4=577 2315 94 717 total=3703
dt4=300 1909 109 356 total=2674
dt4=450 2364 127 476 total=3417
dt4=532 2544 194 891 total=4161
dt4=835 2365 71 620 total=3891
dt4=223 1330 82 294 total=1929
dt4=738 2559 115 456 total=3868
dt4=247 1253 97 185 total=1782
newSVpvz() with unsafe Copy()
dt4=2483 432 77 176 total=3168
dt4=1097 706 94 165 total=2062
dt4=1200 867 74 229 total=2370
dt4=1032 497 135 127 total=1791
dt4=862 521 76 209 total=1668
dt4=4077 526 268 168 total=5039
dt4=836 126 94 130 total=1186
dt4=4859 329 80 141 total=5409
dt4=1053 518 79 124 total=1774
dt4=1626 712 53 132 total=2523
dt4=1138 480 50 138 total=1806
dt4=1356 588 206 229 total=2379
dt4=1168 694 76 165 total=2103
dt4=1000 209 94 197 total=1500
dt4=1462 1394 91 112 total=3059
dt4=603 130 91 185 total=1009
dt4=829 794 100 159 total=1882
dt4=1079 656 150 144 total=2029
dt4=1706 1106 194 162 total=3168
dt4=1197 1179 62 209 total=2647
dt4=3923 983 532 365 total=5803
dt4=7276 824 403 147 total=8650
dt4=1112 612 103 111 total=1938
dt4=1103 1303 164 159 total=2729
dt4=2297 676 171 132 total=3276
dt4=1062 659 200 94 total=2015
dt4=4818 970 471 173 total=6432
dt4=4462 482 215 170 total=5329
dt4=1570 553 147 147 total=2417
dt4=1053 379 118 209 total=1759
dt4=2726 615 100 197 total=3638
dt4=4024 376 106 194 total=4700
dt4=4577 535 318 132 total=5562
dt4=1309 650 156 279 total=2394
dt4=579 209 91 265 total=1144
dt4=1323 518 297 112 total=2250
dt4=1291 771 171 150 total=2383
dt4=839 176 106 232 total=1353
dt4=794 697 124 159 total=1774
dt4=1647 294 141 218 total=2300
dt4=3141 518 211 197 total=4067
dt4=782 532 97 133 total=1544
dt4=1864 806 180 150 total=3000
dt4=1659 312 65 158 total=2194
dt4=1267 521 153 235 total=2176
dt4=638 159 85 171 total=1053
dt4=697 703 535 103 total=2038
dt4=982 250 65 165 total=1462
dt4=614 753 71 135 total=1573
dt4=661 271 129 115 total=1176
dt4=603 164 89 191 total=1047
dt4=609 261 112 174 total=1156
dt4=1397 776 159 253 total=2585
dt4=1559 541 132 218 total=2450
dt4=800 150 62 182 total=1194
dt4=2017 830 150 241 total=3238
dt4=900 641 200 223 total=1964
dt4=806 185 62 241 total=1294
dt4=529 189 73 168 total=959
dt4=1170 671 209 253 total=2303
dt4=1338 750 183 241 total=2512
dt4=1029 550 174 214 total=1967
dt4=680 756 114 186 total=1736
dt4=606 267 127 147 total=1147
dt4=1356 947 256 218 total=2777
dt4=803 135 71 162 total=1171
dt4=744 159 85 194 total=1182
dt4=2038 536 138 265 total=2977
dt4=741 212 73 165 total=1191
dt4=982 612 112 235 total=1941
dt4=659 241 77 197 total=1174
dt4=994 253 68 179 total=1494
dt4=1282 577 156 194 total=2209
dt4=673 124 73 118 total=988
dt4=694 185 65 179 total=1123
dt4=1368 741 144 274 total=2527
dt4=888 144 65 141 total=1238
dt4=829 232 68 162 total=1291
dt4=779 265 73 136 total=1253
dt4=692 185 97 206 total=1180
dt4=888 436 126 203 total=1653
dt4=644 144 77 138 total=1003
dt4=764 130 79 171 total=1144
dt4=1550 509 156 112 total=2327
dt4=826 253 65 250 total=1394
dt4=694 162 62 141 total=1059
dt4=686 420 65 185 total=1356
dt4=694 147 121 156 total=1118
dt4=580 167 112 174 total=1033
dt4=700 185 88 206 total=1179
dt4=2232 671 106 129 total=3138
dt4=712 212 76 136 total=1136
dt4=721 235 73 186 total=1215
dt4=706 138 65 194 total=1103
dt4=1556 926 180 153 total=2815
dt4=959 329 59 135 total=1482
dt4=782 215 70 159 total=1226
dt4=1353 141 68 135 total=1697
dt4=786 767 112 185 total=1850
dt4=665 173 68 91 total=997
dt4=671 156 70 162 total=1059