Skip to content

toke.c op.c : rmv 2nd realloc() when cat()ing HEK + "::" + PV #23414

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: blead
Choose a base branch
from

Conversation

bulk88
Copy link
Contributor

@bulk88 bulk88 commented Jul 8, 2025

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:

baseline perl

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


  • This set of changes does not require a perldelta entry.

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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant