Skip to content

Use NonZero in MixedUnit for C strings #15

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: main
Choose a base branch
from

Conversation

hkBst
Copy link
Member

@hkBst hkBst commented Jun 20, 2025

Make C strings safer, by encoding the absence of nulls in the type system. This is made possible by rust-lang/rust#141001 which should hit stable in 1.89.

Seems to be a big regression as written (on ARM):

bench name current new diff
bench_check_raw_byte_str_ascii 44610.02 ns/iter (+/- 77.15) 44654.95 ns/iter (+/- 90.49) 0.1%
bench_check_raw_c_str_ascii 41243.39 ns/iter (+/- 55.29) 41264.12 ns/iter (+/- 153.69) 0.1%
bench_check_raw_c_str_non_ascii 52439.23 ns/iter (+/- 84.53) 52488.66 ns/iter (+/- 86.07) 0.1%
bench_check_raw_c_str_unicode 175322.05 ns/iter (+/- 965.72) 174987.44 ns/iter (+/- 1163.35) -0.2%
bench_check_raw_str_ascii 39636.83 ns/iter (+/- 117.33) 39958.79 ns/iter (+/- 92.06) 0.8%
bench_check_raw_str_non_ascii 52357.56 ns/iter (+/- 86.31) 52361.94 ns/iter (+/- 81.67) 0.0%
bench_check_raw_str_unicode 167528.47 ns/iter (+/- 331.73) 167434.16 ns/iter (+/- 360.78) -0.1%
bench_skip_ascii_whitespace 12058.54 ns/iter (+/- 6.57) 13088.4 ns/iter (+/- 24.97) 8.5%
bench_unescape_byte_str_ascii 69210.1 ns/iter (+/- 117.62) 69372.14 ns/iter (+/- 98.86) 0.2%
bench_unescape_byte_str_ascii_escape 81301.98 ns/iter (+/- 98.52) 105345.08 ns/iter (+/- 190.93) 29.6%
bench_unescape_byte_str_hex_escape 126000.81 ns/iter (+/- 233.56) 149981.02 ns/iter (+/- 180.47) 19.0%
bench_unescape_byte_str_mixed_escape 339565.55 ns/iter (+/- 663.24) 378690.78 ns/iter (+/- 798.67) 11.5%
bench_unescape_c_str_ascii 81571.46 ns/iter (+/- 197.89) 81520.59 ns/iter (+/- 152.12) -0.1%
bench_unescape_c_str_ascii_escape 98059.88 ns/iter (+/- 168.09) 125366.93 ns/iter (+/- 397.07) 27.8%
bench_unescape_c_str_hex_escape_ascii 163332.28 ns/iter (+/- 377.46) 183899.76 ns/iter (+/- 573.1) 12.6%
bench_unescape_c_str_hex_escape_byte 161700.48 ns/iter (+/- 452.36) 184475.22 ns/iter (+/- 653.24) 14.1%
bench_unescape_c_str_mixed_escape 1054289.9 ns/iter (+/- 2924.62) 1145017.5 ns/iter (+/- 4347.21) 8.6%
bench_unescape_c_str_non_ascii 110857.8 ns/iter (+/- 232.14) 110232.96 ns/iter (+/- 271.54) -0.6%
bench_unescape_c_str_unicode 388721.45 ns/iter (+/- 1832.95) 388436.35 ns/iter (+/- 1244.05) -0.1%
bench_unescape_c_str_unicode_escape 310894.53 ns/iter (+/- 675.58) 318635.4 ns/iter (+/- 588.72) 2.5%
bench_unescape_str_ascii 71926.04 ns/iter (+/- 82.6) 77180.16 ns/iter (+/- 141.34) 7.3%
bench_unescape_str_ascii_escape 102622.86 ns/iter (+/- 392.0) 133627.08 ns/iter (+/- 184.91) 30.2%
bench_unescape_str_hex_escape 166499.67 ns/iter (+/- 469.53) 186393.08 ns/iter (+/- 345.71) 11.9%
bench_unescape_str_mixed_escape 904846.38 ns/iter (+/- 2516.89) 986019.6 ns/iter (+/- 1738.52) 9.0%
bench_unescape_str_non_ascii 98374.47 ns/iter (+/- 129.5) 97908.47 ns/iter (+/- 153.62) -0.5%
bench_unescape_str_unicode 343998.47 ns/iter (+/- 880.1) 345863.3 ns/iter (+/- 657.07) 0.5%
bench_unescape_str_unicode_escape 595883.52 ns/iter (+/- 4620.92) 635966.38 ns/iter (+/- 798.52) 6.7%

@hkBst
Copy link
Member Author

hkBst commented Jun 23, 2025

New bench after rebase, still regressing (on ARM):

bench name current new diff
bench_check_raw_byte_str_ascii 44639.04 ns/iter (+/- 71.86) 44633.22 ns/iter (+/- 65.53) -0.0%
bench_check_raw_c_str_ascii 41289.06 ns/iter (+/- 80.46) 41280.67 ns/iter (+/- 52.0) -0.0%
bench_check_raw_c_str_non_ascii 52493.15 ns/iter (+/- 75.91) 52491.51 ns/iter (+/- 81.16) -0.0%
bench_check_raw_c_str_unicode 174601.08 ns/iter (+/- 1708.93) 175265.45 ns/iter (+/- 932.32) 0.4%
bench_check_raw_str_ascii 40617.39 ns/iter (+/- 72.24) 40638.75 ns/iter (+/- 67.75) 0.1%
bench_check_raw_str_non_ascii 50443.77 ns/iter (+/- 64.5) 50447.15 ns/iter (+/- 85.57) 0.0%
bench_check_raw_str_unicode 167877.1 ns/iter (+/- 450.94) 167587.6 ns/iter (+/- 363.93) -0.2%
bench_skip_ascii_whitespace 13124.12 ns/iter (+/- 21.57) 12092.16 ns/iter (+/- 7.34) -7.9%
bench_unescape_byte_str_ascii 72015.72 ns/iter (+/- 197.75) 71917.45 ns/iter (+/- 159.28) -0.1%
bench_unescape_byte_str_ascii_escape 81212.75 ns/iter (+/- 125.82) 101553.12 ns/iter (+/- 213.74) 25.0%
bench_unescape_byte_str_hex_escape 125661.74 ns/iter (+/- 205.48) 145728.98 ns/iter (+/- 190.31) 16.0%
bench_unescape_byte_str_mixed_escape 347796.68 ns/iter (+/- 1137.38) 375593.79 ns/iter (+/- 555.62) 8.0%
bench_unescape_c_str_ascii 81542.57 ns/iter (+/- 178.04) 81887.19 ns/iter (+/- 357.76) 0.4%
bench_unescape_c_str_ascii_escape 96352.47 ns/iter (+/- 216.99) 125572.16 ns/iter (+/- 210.0) 30.3%
bench_unescape_c_str_hex_escape_ascii 161409.62 ns/iter (+/- 347.51) 186294.32 ns/iter (+/- 387.11) 15.4%
bench_unescape_c_str_hex_escape_byte 162213.98 ns/iter (+/- 266.46) 186187.18 ns/iter (+/- 642.11) 14.8%
bench_unescape_c_str_mixed_escape 1044968.1 ns/iter (+/- 5590.8) 1146097.5 ns/iter (+/- 3564.66) 9.7%
bench_unescape_c_str_non_ascii 110542.91 ns/iter (+/- 193.2) 110230.1 ns/iter (+/- 207.58) -0.3%
bench_unescape_c_str_unicode 384345.8 ns/iter (+/- 1529.57) 388469.95 ns/iter (+/- 1881.49) 1.1%
bench_unescape_c_str_unicode_escape 308380.05 ns/iter (+/- 1680.4) 316255.67 ns/iter (+/- 657.98) 2.6%
bench_unescape_str_ascii 77109.62 ns/iter (+/- 134.09) 71986.74 ns/iter (+/- 153.02) -6.6%
bench_unescape_str_ascii_escape 105410.17 ns/iter (+/- 245.33) 121219.55 ns/iter (+/- 541.69) 15.0%
bench_unescape_str_hex_escape 165387.27 ns/iter (+/- 692.67) 179651.5 ns/iter (+/- 463.31) 8.6%
bench_unescape_str_mixed_escape 905730.0 ns/iter (+/- 2516.37) 968862.0 ns/iter (+/- 3614.17) 7.0%
bench_unescape_str_non_ascii 97985.04 ns/iter (+/- 204.93) 98175.32 ns/iter (+/- 191.07) 0.2%
bench_unescape_str_unicode 343506.0 ns/iter (+/- 767.26) 344200.25 ns/iter (+/- 713.67) 0.2%
bench_unescape_str_unicode_escape 596488.05 ns/iter (+/- 2449.86) 618829.1 ns/iter (+/- 4882.74) 3.7%

@hkBst
Copy link
Member Author

hkBst commented Jun 23, 2025

Seems to be a result of inlining decisions by the compiler, as sprinkling #[inline] can remove almost all of these regressions. But there also seem to be differences between arm and x86-64 which I haven't fully investigated. Above results are from dev-desktop-eu-1 which is an arm machine, dev-desktop-eu-2 which is x86-64 is often too overloaded to do useful perf runs, so I'm still waiting my chance to get some numbers there.

@GuillaumeGomez
Copy link
Member

Should we try to add some #[inline] attributes to make the results more coherent across platforms? In any case, thanks for the investigation. :)

@hkBst
Copy link
Member Author

hkBst commented Jun 24, 2025

Yes, I have something in the works... :D

@rust-cloud-vms rust-cloud-vms bot force-pushed the nonzero-for-cstr branch 2 times, most recently from 849c0aa to 02622e1 Compare June 25, 2025 05:30
@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

Now uses inline, but main branch does as well (aarch64):

bench name current new diff
bench_check_raw_byte_str_ascii 44650.18 ns/iter (+/- 70.81) 44533.43 ns/iter (+/- 103.05) -0.3%
bench_check_raw_c_str_ascii 41068.84 ns/iter (+/- 68.15) 41250.85 ns/iter (+/- 64.3) 0.4%
bench_check_raw_c_str_non_ascii 52571.49 ns/iter (+/- 127.06) 52459.57 ns/iter (+/- 58.89) -0.2%
bench_check_raw_c_str_unicode 173802.95 ns/iter (+/- 1207.32) 175224.85 ns/iter (+/- 1159.26) 0.8%
bench_check_raw_str_ascii 40610.04 ns/iter (+/- 82.21) 39727.79 ns/iter (+/- 164.35) -2.2%
bench_check_raw_str_non_ascii 50443.22 ns/iter (+/- 97.11) 52359.84 ns/iter (+/- 89.4) 3.8%
bench_check_raw_str_unicode 167963.04 ns/iter (+/- 484.17) 167434.5 ns/iter (+/- 432.02) -0.3%
bench_skip_ascii_whitespace 13093.38 ns/iter (+/- 26.19) 12066.0 ns/iter (+/- 31.52) -7.8%
bench_unescape_byte_str_ascii 69100.45 ns/iter (+/- 432.45) 68984.58 ns/iter (+/- 132.12) -0.2%
bench_unescape_byte_str_ascii_escape 81191.7 ns/iter (+/- 160.36) 81509.99 ns/iter (+/- 124.64) 0.4%
bench_unescape_byte_str_hex_escape 125710.23 ns/iter (+/- 249.69) 125518.36 ns/iter (+/- 175.21) -0.2%
bench_unescape_byte_str_mixed_escape 348001.76 ns/iter (+/- 744.65) 346611.8 ns/iter (+/- 1351.53) -0.4%
bench_unescape_c_str_ascii 76427.57 ns/iter (+/- 157.23) 81063.19 ns/iter (+/- 172.25) 6.1%
bench_unescape_c_str_ascii_escape 97552.21 ns/iter (+/- 281.07) 100733.48 ns/iter (+/- 225.35) 3.3%
bench_unescape_c_str_hex_escape_ascii 153640.47 ns/iter (+/- 324.63) 153549.42 ns/iter (+/- 351.37) -0.1%
bench_unescape_c_str_hex_escape_byte 149599.33 ns/iter (+/- 327.83) 153561.85 ns/iter (+/- 301.79) 2.6%
bench_unescape_c_str_mixed_escape 1015755.7 ns/iter (+/- 2449.83) 1030985.0 ns/iter (+/- 3087.59) 1.5%
bench_unescape_c_str_non_ascii 95360.2 ns/iter (+/- 179.75) 97644.89 ns/iter (+/- 2220.02) 2.4%
bench_unescape_c_str_unicode 341073.0 ns/iter (+/- 2345.96) 358572.8 ns/iter (+/- 2906.45) 5.1%
bench_unescape_c_str_unicode_escape 310187.73 ns/iter (+/- 756.66) 310131.4 ns/iter (+/- 871.99) -0.0%
bench_unescape_str_ascii 73180.83 ns/iter (+/- 153.8) 71541.78 ns/iter (+/- 133.0) -2.2%
bench_unescape_str_ascii_escape 102901.95 ns/iter (+/- 967.59) 102401.92 ns/iter (+/- 836.98) -0.5%
bench_unescape_str_hex_escape 165145.35 ns/iter (+/- 878.86) 165728.33 ns/iter (+/- 429.98) 0.4%
bench_unescape_str_mixed_escape 904720.6 ns/iter (+/- 2407.9) 903146.1 ns/iter (+/- 4903.9) -0.2%
bench_unescape_str_non_ascii 97915.37 ns/iter (+/- 180.74) 98170.11 ns/iter (+/- 221.23) 0.3%
bench_unescape_str_unicode 342992.15 ns/iter (+/- 830.73) 340786.25 ns/iter (+/- 1017.69) -0.6%
bench_unescape_str_unicode_escape 596083.95 ns/iter (+/- 1762.63) 593935.9 ns/iter (+/- 9366.03) -0.4%

@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

And x86-64:

bench name current new diff
bench_check_raw_byte_str_ascii 25153.79 ns/iter (+/- 943.68) 23732.55 ns/iter (+/- 268.59) -5.7%
bench_check_raw_c_str_ascii 24636.86 ns/iter (+/- 794.76) 26738.06 ns/iter (+/- 342.49) 8.5%
bench_check_raw_c_str_non_ascii 37595.23 ns/iter (+/- 967.91) 37014.46 ns/iter (+/- 55.09) -1.5%
bench_check_raw_c_str_unicode 119069.48 ns/iter (+/- 1791.5) 117355.81 ns/iter (+/- 5653.23) -1.4%
bench_check_raw_str_ascii 22449.31 ns/iter (+/- 1204.4) 26426.81 ns/iter (+/- 55.97) 17.7%
bench_check_raw_str_non_ascii 35611.88 ns/iter (+/- 77.16) 35610.19 ns/iter (+/- 80.3) -0.0%
bench_check_raw_str_unicode 113391.5 ns/iter (+/- 769.5) 110205.33 ns/iter (+/- 1868.29) -2.8%
bench_skip_ascii_whitespace 8403.35 ns/iter (+/- 20.65) 8073.9 ns/iter (+/- 130.68) -3.9%
bench_unescape_byte_str_ascii 43316.39 ns/iter (+/- 229.77) 46829.69 ns/iter (+/- 151.75) 8.1%
bench_unescape_byte_str_ascii_escape 53734.36 ns/iter (+/- 179.55) 60663.47 ns/iter (+/- 88.94) 12.9%
bench_unescape_byte_str_hex_escape 82220.4 ns/iter (+/- 964.59) 83406.87 ns/iter (+/- 1357.42) 1.4%
bench_unescape_byte_str_mixed_escape 235522.9 ns/iter (+/- 3868.01) 256214.12 ns/iter (+/- 985.83) 8.8%
bench_unescape_c_str_ascii 43569.44 ns/iter (+/- 710.9) 52391.49 ns/iter (+/- 770.61) 20.2%
bench_unescape_c_str_ascii_escape 64381.9 ns/iter (+/- 281.27) 66013.82 ns/iter (+/- 800.07) 2.5%
bench_unescape_c_str_hex_escape_ascii 89664.42 ns/iter (+/- 2288.74) 92370.24 ns/iter (+/- 1005.55) 3.0%
bench_unescape_c_str_hex_escape_byte 89610.75 ns/iter (+/- 1768.9) 91592.4 ns/iter (+/- 1469.02) 2.2%
bench_unescape_c_str_mixed_escape 594463.95 ns/iter (+/- 6528.45) 591335.44 ns/iter (+/- 6582.11) -0.5%
bench_unescape_c_str_non_ascii 60939.89 ns/iter (+/- 1030.87) 69679.44 ns/iter (+/- 2202.83) 14.3%
bench_unescape_c_str_unicode 211297.55 ns/iter (+/- 3610.23) 246906.15 ns/iter (+/- 5843.48) 16.9%
bench_unescape_c_str_unicode_escape 176211.8 ns/iter (+/- 1057.58) 170699.13 ns/iter (+/- 2206.74) -3.1%
bench_unescape_str_ascii 48623.35 ns/iter (+/- 1274.16) 46361.41 ns/iter (+/- 478.22) -4.7%
bench_unescape_str_ascii_escape 70438.24 ns/iter (+/- 2617.1) 68419.01 ns/iter (+/- 2390.45) -2.9%
bench_unescape_str_hex_escape 107434.99 ns/iter (+/- 1617.92) 106214.02 ns/iter (+/- 2726.1) -1.1%
bench_unescape_str_mixed_escape 582088.9 ns/iter (+/- 5690.91) 583478.55 ns/iter (+/- 11911.95) 0.2%
bench_unescape_str_non_ascii 64438.57 ns/iter (+/- 1350.07) 64234.8 ns/iter (+/- 866.43) -0.3%
bench_unescape_str_unicode 230390.89 ns/iter (+/- 5236.79) 223707.82 ns/iter (+/- 3106.17) -2.9%
bench_unescape_str_unicode_escape 376554.4 ns/iter (+/- 5425.5) 383888.44 ns/iter (+/- 5642.74) 1.9%

@hkBst hkBst marked this pull request as ready for review June 25, 2025 11:09
@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

Today's nightly (28f1c8079 2025-06-24) bench rerun (aarch64):

bench name current new diff
bench_check_raw_byte_str_ascii 44342.34 ns/iter (+/- 83.84) 44553.86 ns/iter (+/- 64.83) 0.5%
bench_check_raw_c_str_ascii 41067.41 ns/iter (+/- 75.04) 41255.44 ns/iter (+/- 92.79) 0.5%
bench_check_raw_c_str_non_ascii 52563.06 ns/iter (+/- 81.78) 52455.53 ns/iter (+/- 103.22) -0.2%
bench_check_raw_c_str_unicode 173704.5 ns/iter (+/- 1072.52) 175189.6 ns/iter (+/- 1263.83) 0.9%
bench_check_raw_str_ascii 39604.61 ns/iter (+/- 54.11) 40623.23 ns/iter (+/- 73.56) 2.6%
bench_check_raw_str_non_ascii 52355.27 ns/iter (+/- 89.8) 50412.34 ns/iter (+/- 173.49) -3.7%
bench_check_raw_str_unicode 167169.1 ns/iter (+/- 305.45) 168095.96 ns/iter (+/- 548.09) 0.6%
bench_skip_ascii_whitespace 12080.81 ns/iter (+/- 36.06) 12059.09 ns/iter (+/- 8.13) -0.2%
bench_unescape_byte_str_ascii 72210.47 ns/iter (+/- 104.8) 69120.45 ns/iter (+/- 139.45) -4.3%
bench_unescape_byte_str_ascii_escape 81180.9 ns/iter (+/- 128.21) 81455.81 ns/iter (+/- 199.26) 0.3%
bench_unescape_byte_str_hex_escape 125616.36 ns/iter (+/- 240.7) 125825.2 ns/iter (+/- 278.53) 0.2%
bench_unescape_byte_str_mixed_escape 348300.4 ns/iter (+/- 2102.29) 348917.15 ns/iter (+/- 1267.77) 0.2%
bench_unescape_c_str_ascii 79577.9 ns/iter (+/- 165.32) 80953.54 ns/iter (+/- 144.05) 1.7%
bench_unescape_c_str_ascii_escape 100745.16 ns/iter (+/- 174.85) 100731.54 ns/iter (+/- 273.16) -0.0%
bench_unescape_c_str_hex_escape_ascii 156802.03 ns/iter (+/- 375.58) 153611.05 ns/iter (+/- 288.01) -2.0%
bench_unescape_c_str_hex_escape_byte 152797.83 ns/iter (+/- 316.83) 153587.95 ns/iter (+/- 258.41) 0.5%
bench_unescape_c_str_mixed_escape 1032048.4 ns/iter (+/- 2571.04) 1030947.4 ns/iter (+/- 3510.86) -0.1%
bench_unescape_c_str_non_ascii 98631.62 ns/iter (+/- 148.69) 97823.5 ns/iter (+/- 995.74) -0.8%
bench_unescape_c_str_unicode 354322.95 ns/iter (+/- 1250.7) 358356.0 ns/iter (+/- 2320.65) 1.1%
bench_unescape_c_str_unicode_escape 313363.97 ns/iter (+/- 586.1) 310180.1 ns/iter (+/- 811.19) -1.0%
bench_unescape_str_ascii 73216.99 ns/iter (+/- 146.36) 71598.75 ns/iter (+/- 182.65) -2.2%
bench_unescape_str_ascii_escape 102818.88 ns/iter (+/- 210.38) 102694.37 ns/iter (+/- 225.52) -0.1%
bench_unescape_str_hex_escape 164356.28 ns/iter (+/- 249.14) 165551.38 ns/iter (+/- 247.75) 0.7%
bench_unescape_str_mixed_escape 903389.0 ns/iter (+/- 1952.41) 904361.1 ns/iter (+/- 2725.98) 0.1%
bench_unescape_str_non_ascii 98219.37 ns/iter (+/- 215.35) 98119.87 ns/iter (+/- 195.89) -0.1%
bench_unescape_str_unicode 342872.35 ns/iter (+/- 1324.02) 341494.5 ns/iter (+/- 661.5) -0.4%
bench_unescape_str_unicode_escape 594178.6 ns/iter (+/- 2321.63) 595380.3 ns/iter (+/- 5439.95) 0.2%

Some things to notice:

  • bench_check_raw_str_ascii and bench_check_raw_str_non_ascii have both inverted (win<->loss) their results (I suppose this is what they call bimodal in the rustc perf reports)
  • bench_unescape_byte_str_ascii got worse in main
  • bench_unescape_c_str_ascii got slightly worse in main and slightly better with this change (or it's just noise)
  • bench_unescape_c_str_hex_escape_ascii got worse in main (or it's just noise)

@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

Today's nightly (28f1c8079 2025-06-24) bench rerun (amd64):

bench name current new diff
bench_check_raw_byte_str_ascii 23989.43 ns/iter (+/- 288.17) 22265.36 ns/iter (+/- 250.51) -7.2%
bench_check_raw_c_str_ascii 26757.81 ns/iter (+/- 414.68) 24519.85 ns/iter (+/- 440.8) -8.4%
bench_check_raw_c_str_non_ascii 37027.88 ns/iter (+/- 67.62) 38696.53 ns/iter (+/- 1110.55) 4.5%
bench_check_raw_c_str_unicode 117392.3 ns/iter (+/- 1652.76) 119498.12 ns/iter (+/- 2012.08) 1.8%
bench_check_raw_str_ascii 24705.51 ns/iter (+/- 213.86) 23426.53 ns/iter (+/- 1686.61) -5.2%
bench_check_raw_str_non_ascii 35596.23 ns/iter (+/- 100.89) 35581.79 ns/iter (+/- 78.69) -0.0%
bench_check_raw_str_unicode 113316.49 ns/iter (+/- 574.08) 109659.72 ns/iter (+/- 1144.37) -3.2%
bench_skip_ascii_whitespace 8164.14 ns/iter (+/- 56.81) 8399.28 ns/iter (+/- 12.89) 2.9%
bench_unescape_byte_str_ascii 46869.94 ns/iter (+/- 166.63) 43469.84 ns/iter (+/- 989.0) -7.3%
bench_unescape_byte_str_ascii_escape 60668.34 ns/iter (+/- 82.72) 54050.38 ns/iter (+/- 1427.94) -10.9%
bench_unescape_byte_str_hex_escape 82673.28 ns/iter (+/- 1304.25) 82102.14 ns/iter (+/- 1590.3) -0.7%
bench_unescape_byte_str_mixed_escape 255369.97 ns/iter (+/- 925.33) 236564.13 ns/iter (+/- 1731.47) -7.4%
bench_unescape_c_str_ascii 44672.29 ns/iter (+/- 708.26) 47399.35 ns/iter (+/- 326.1) 6.1%
bench_unescape_c_str_ascii_escape 69553.01 ns/iter (+/- 1186.7) 57897.21 ns/iter (+/- 886.27) -16.8%
bench_unescape_c_str_hex_escape_ascii 92761.19 ns/iter (+/- 1481.14) 89108.77 ns/iter (+/- 900.64) -3.9%
bench_unescape_c_str_hex_escape_byte 92012.54 ns/iter (+/- 2398.19) 88861.85 ns/iter (+/- 1027.45) -3.4%
bench_unescape_c_str_mixed_escape 606424.72 ns/iter (+/- 5507.5) 579235.9 ns/iter (+/- 3444.5) -4.5%
bench_unescape_c_str_non_ascii 61144.26 ns/iter (+/- 1087.88) 64575.29 ns/iter (+/- 1233.93) 5.6%
bench_unescape_c_str_unicode 212252.1 ns/iter (+/- 3471.0) 225109.35 ns/iter (+/- 3647.45) 6.1%
bench_unescape_c_str_unicode_escape 183845.98 ns/iter (+/- 2371.44) 168802.21 ns/iter (+/- 170.41) -8.2%
bench_unescape_str_ascii 46917.06 ns/iter (+/- 211.19) 48181.34 ns/iter (+/- 2122.61) 2.7%
bench_unescape_str_ascii_escape 71407.28 ns/iter (+/- 1506.5) 71912.5 ns/iter (+/- 581.46) 0.7%
bench_unescape_str_hex_escape 107980.17 ns/iter (+/- 2130.15) 109233.12 ns/iter (+/- 1867.09) 1.2%
bench_unescape_str_mixed_escape 582259.03 ns/iter (+/- 6388.88) 582018.0 ns/iter (+/- 7581.5) -0.0%
bench_unescape_str_non_ascii 64199.24 ns/iter (+/- 143.53) 65068.35 ns/iter (+/- 1017.13) 1.4%
bench_unescape_str_unicode 226866.3 ns/iter (+/- 4417.82) 228579.37 ns/iter (+/- 5844.3) 0.8%
bench_unescape_str_unicode_escape 383880.56 ns/iter (+/- 6032.75) 375763.45 ns/iter (+/- 5358.45) -2.1%

Some things to notice:

  • bench_check_raw_str_ascii got worse in main and better in this change (or it's noise)
  • bench_unescape_byte_str_ascii, bench_unescape_byte_str_ascii_escape, and bench_unescape_byte_str_mixed_escape inverted results (win <-> loss) (bimodal benchmark?)
  • bench_unescape_c_str_ascii and bench_unescape_c_str_ascii_escape seems to have improved, though main also got slightly worse
  • bench_unescape_c_str_unicode_escape looks like noise in main
  • followed by more results that either stayed similar, inverted or got slightly better

@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

In conclusion it seems that the perf impact of this change is largely neutral.

@GuillaumeGomez
Copy link
Member

Should we close it then?

@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

Well, the main reason to do it is to give more guarantees for C strings, which cannot contain nulls. This change makes this guaranteed by the type system. So as perf looks neutral, I think we should do it.

@GuillaumeGomez
Copy link
Member

Oh my bad, thought it was about performance. Then seems all good if perf are not negatively impacted. 👍

Please just fix the CI and then seems all good to me.

@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

NonZero<char> is still riding the release train, see rust-lang/rust#141001. It should land in stable in 1.89, so there's not much we can do about that I think.

@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

Which use cases require stable support?

@GuillaumeGomez
Copy link
Member

None as far as I know but considering it's a public crate and that 1.89 will be released in less than 3 months, I suppose we can just wait?

@hkBst
Copy link
Member Author

hkBst commented Jun 25, 2025

Sure waiting is one options, and given 1.88 is around the corner, it should only be about 6 weeks.

Possible alternatives:

  • a "nightly" feature flag, though this would I think involve a lot of temporary code duplication. Seems unwieldy.
  • an MSRV set to 1.89 for the next release? Seems simple, but is it effective?

@GuillaumeGomez
Copy link
Member

MSRV is working well nowadays with cargo as it prevents to update to a newer version if MSRV is incompatible. So raising MSRV to 1.89 once it's out seems like the best idea to me.

@rust-cloud-vms rust-cloud-vms bot force-pushed the nonzero-for-cstr branch 2 times, most recently from c3730e8 to 6bd7251 Compare June 26, 2025 06:52
@hkBst
Copy link
Member Author

hkBst commented Jun 26, 2025

I added the MSRV, which should cause cargo to emit an error against lower versions. I would expect to see that reflected in the stable-checks CI here, but I don't... because I failed to actually push the right change. Now produces:

error: rustc 1.87.0 is not supported by the following packages:
  rustc-literal-escaper@0.0.4 requires rustc 1.89
  rustc-literal-escaper@0.0.4 requires rustc 1.89
  rustc-literal-escaper@0.0.4 requires rustc 1.89

not sure why three times...

@hkBst
Copy link
Member Author

hkBst commented Jul 1, 2025

@GuillaumeGomez will anyone be disadvantaged if we were to do a release with this change right now? If MSRV is well supported now, then presumably no-one is disadvantaged?

@GuillaumeGomez
Copy link
Member

Well, we still need 1.89 to be released. So just 6 more weeks to wait and then we can do a release.

However, we can already release the latest changes you made which improved performance if you want?

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.

2 participants