Skip to content

Conversation

@hkBst
Copy link
Member

@hkBst hkBst commented Jun 24, 2025

On ARM:

bench name current new diff
bench_check_raw_byte_str_ascii 44621.22 ns/iter (+/- 67.52) 32252.26 ns/iter (+/- 85.11) -27.7%
bench_check_raw_c_str_ascii 41249.71 ns/iter (+/- 459.54) 30423.24 ns/iter (+/- 33.53) -26.2%
bench_check_raw_c_str_non_ascii 52466.45 ns/iter (+/- 78.41) 52351.31 ns/iter (+/- 56.71) -0.2%
bench_check_raw_c_str_unicode 174486.0 ns/iter (+/- 1116.62) 166608.7 ns/iter (+/- 1539.8) -4.5%
bench_check_raw_str_ascii 40627.54 ns/iter (+/- 87.79) 28335.81 ns/iter (+/- 41.45) -30.3%
bench_check_raw_str_non_ascii 50431.16 ns/iter (+/- 82.04) 50323.16 ns/iter (+/- 72.71) -0.2%
bench_check_raw_str_unicode 168052.34 ns/iter (+/- 728.17) 157957.16 ns/iter (+/- 602.8) -6.0%
bench_skip_ascii_whitespace 13112.82 ns/iter (+/- 56.07) 12063.44 ns/iter (+/- 52.15) -8.0%
bench_unescape_byte_str_ascii 69061.89 ns/iter (+/- 201.68) 69282.8 ns/iter (+/- 215.7) 0.3%
bench_unescape_byte_str_ascii_escape 81271.92 ns/iter (+/- 224.8) 81490.03 ns/iter (+/- 182.96) 0.3%
bench_unescape_byte_str_hex_escape 125719.84 ns/iter (+/- 295.52) 124372.93 ns/iter (+/- 421.28) -1.1%
bench_unescape_byte_str_mixed_escape 348058.69 ns/iter (+/- 3154.79) 346675.38 ns/iter (+/- 2412.19) -0.4%
bench_unescape_c_str_ascii 81765.96 ns/iter (+/- 158.23) 78098.67 ns/iter (+/- 152.0) -4.5%
bench_unescape_c_str_ascii_escape 96378.31 ns/iter (+/- 1333.76) 99110.02 ns/iter (+/- 151.25) 2.8%
bench_unescape_c_str_hex_escape_ascii 161821.62 ns/iter (+/- 672.23) 151202.48 ns/iter (+/- 301.01) -6.6%
bench_unescape_c_str_hex_escape_byte 162515.88 ns/iter (+/- 375.19) 145952.07 ns/iter (+/- 348.79) -10.2%
bench_unescape_c_str_mixed_escape 1046189.8 ns/iter (+/- 3429.65) 1022389.5 ns/iter (+/- 2655.44) -2.3%
bench_unescape_c_str_non_ascii 110622.88 ns/iter (+/- 286.26) 96923.48 ns/iter (+/- 351.63) -12.4%
bench_unescape_c_str_unicode 385263.4 ns/iter (+/- 1329.9) 347683.62 ns/iter (+/- 1072.2) -9.8%
bench_unescape_c_str_unicode_escape 308760.33 ns/iter (+/- 1787.27) 312357.17 ns/iter (+/- 646.29) 1.2%
bench_unescape_str_ascii 77105.57 ns/iter (+/- 163.34) 71903.65 ns/iter (+/- 183.93) -6.7%
bench_unescape_str_ascii_escape 105557.74 ns/iter (+/- 219.26) 102428.44 ns/iter (+/- 748.51) -3.0%
bench_unescape_str_hex_escape 165474.25 ns/iter (+/- 457.63) 165896.69 ns/iter (+/- 557.95) 0.3%
bench_unescape_str_mixed_escape 906218.8 ns/iter (+/- 2277.11) 904109.3 ns/iter (+/- 4160.06) -0.2%
bench_unescape_str_non_ascii 98056.04 ns/iter (+/- 178.18) 98091.26 ns/iter (+/- 182.63) 0.0%
bench_unescape_str_unicode 343870.1 ns/iter (+/- 1217.51) 343175.53 ns/iter (+/- 1244.8) -0.2%
bench_unescape_str_unicode_escape 596445.35 ns/iter (+/- 2718.8) 594864.6 ns/iter (+/- 9608.78) -0.3%

Someone please check x86_64!

BTW I made some small improvements (I hope) to the bench script (mostly in get_good_results):

import subprocess


class Bench:
    def __init__(self, line):
        self.name = line.split(' ')[1]
        self.speed = float(line.split('... bench:')[1].split('/iter')[0].strip().split(' ')[0].replace(',', ''))
        self.margin = float(line.split('(+/-')[1].split(')')[0].strip().replace(',', ''))


def run_bench():
    res = subprocess.run(["cargo", "+nightly", "bench"], check=True, stdout=subprocess.PIPE)
    return res.stdout.decode('utf-8')


def get_benches():
    print("> Retrieving benches...")
    out = run_bench()
    print("> Done")

    lines = out.split("\n")
    i = 0
    found_bench = False
    while i < len(lines):
        line = lines[i].strip()
        i += 1
        if line.startswith("test result:"):
            found_bench = True
            break
    if not found_bench:
        raise "Not found benchmarks in:\n{}".format(out)
    benches = {}
    while i < len(lines):
        line = lines[i].strip()
        i += 1
        if line.startswith("test result:"):
            break
        if not line.startswith("test bench_"):
            continue
        bench = Bench(line)
        benches[bench.name] = bench
    return benches


def get_good_results():
    benches = get_benches()

    for i in range(10):
        new_benches = get_benches()
        worst_rel_margin_1000 = 0
        updates = 0
        for key in benches.keys():
            if new_benches[key].speed < benches[key].speed and new_benches[key].margin < 2 * benches[key].margin:
                benches[key] = new_benches[key]
                updates += 1
            rel_margin_1000 = 1000 * benches[key].margin / benches[key].speed
            if rel_margin_1000 > worst_rel_margin_1000:
                worst_rel_margin_1000 = rel_margin_1000
        if worst_rel_margin_1000 > 5:
            print(">> Worst relative margin (iteration {}, updates: {}): {}".format(
                i, updates, worst_rel_margin_1000))
        else:
            break
    return benches


def get_str_for_bench(bench):
    return "{} ns/iter (+/- {})".format(bench.speed, bench.margin)


def show_results(benches):
    print("==== BENCHES RESULTS =====")
    for value in benches.values():
        print("{}: {}".format(value.name, get_str_for_bench(value)))


def show_comparison(current, new_ones):
    print("=== COMPARISON ===")
    print("| bench name | current | new | diff |")
    print("|-|-|-|-|")
    for key in current.keys():
        print("| {} | {} | {} | {:.1f}% |".format(
            key,
            get_str_for_bench(current[key]),
            get_str_for_bench(new_ones[key]),
            (new_ones[key].speed * 100. / current[key].speed) - 100.,
        ))


def main():
    subprocess.run(["git", "checkout", "main"], check=True)
#    subprocess.run(["git", "checkout", "inline-main"], check=True)
#    subprocess.run(["git", "checkout", "nonzero-for-cstr"], check=True)
    current = get_good_results()
    show_results(current)
    
#    subprocess.run(["git", "checkout", "inline"], check=True)
    subprocess.run(["git", "checkout", "inline-main"], check=True)
#    subprocess.run(["git", "checkout", "nonzero-for-cstr"], check=True)
    new_ones = get_good_results()
    show_results(new_ones)
    
    show_comparison(current, new_ones)


if __name__ == "__main__":
    main()

@GuillaumeGomez
Copy link
Member

Checking on x86_64.

@GuillaumeGomez
Copy link
Member

Can you fix the bencher source code please? Markdown broken apparently. ^^;

@hkBst
Copy link
Member Author

hkBst commented Jun 24, 2025

Fixed, by adding newlines around details tags and adding triple backtick quotes around code.

@GuillaumeGomez
Copy link
Member

Thanks!

Here are the results:

bench name current new diff
bench_check_raw_byte_str_ascii 21091.37 ns/iter (+/- 306.46) 23836.23 ns/iter (+/- 148.15) 13.0%
bench_check_raw_c_str_ascii 20228.55 ns/iter (+/- 308.63) 24671.73 ns/iter (+/- 76.81) 22.0%
bench_check_raw_c_str_non_ascii 37315.17 ns/iter (+/- 354.43) 38698.32 ns/iter (+/- 93.38) 3.7%
bench_check_raw_c_str_unicode 115163.2 ns/iter (+/- 196.06) 123726.65 ns/iter (+/- 1754.97) 7.4%
bench_check_raw_str_ascii 19828.49 ns/iter (+/- 216.05) 24592.26 ns/iter (+/- 280.61) 24.0%
bench_check_raw_str_non_ascii 35885.5 ns/iter (+/- 338.35) 37088.98 ns/iter (+/- 104.94) 3.4%
bench_check_raw_str_unicode 109651.19 ns/iter (+/- 455.53) 119296.16 ns/iter (+/- 1830.07) 8.8%
bench_skip_ascii_whitespace 6308.74 ns/iter (+/- 21.53) 6315.13 ns/iter (+/- 19.25) 0.1%
bench_unescape_byte_str_ascii 43806.82 ns/iter (+/- 499.42) 43580.15 ns/iter (+/- 122.83) -0.5%
bench_unescape_byte_str_ascii_escape 49234.48 ns/iter (+/- 379.34) 49047.87 ns/iter (+/- 139.34) -0.4%
bench_unescape_byte_str_hex_escape 78803.46 ns/iter (+/- 870.99) 77621.41 ns/iter (+/- 177.82) -1.5%
bench_unescape_byte_str_mixed_escape 217997.52 ns/iter (+/- 2631.37) 217488.67 ns/iter (+/- 702.22) -0.2%
bench_unescape_c_str_ascii 54373.06 ns/iter (+/- 232.85) 44254.3 ns/iter (+/- 170.22) -18.6%
bench_unescape_c_str_ascii_escape 66438.86 ns/iter (+/- 98.75) 59793.99 ns/iter (+/- 529.13) -10.0%
bench_unescape_c_str_hex_escape_ascii 105934.43 ns/iter (+/- 821.54) 85070.95 ns/iter (+/- 178.62) -19.7%
bench_unescape_c_str_hex_escape_byte 106402.87 ns/iter (+/- 714.71) 85044.34 ns/iter (+/- 167.69) -20.1%
bench_unescape_c_str_mixed_escape 650502.8 ns/iter (+/- 9717.05) 557822.4 ns/iter (+/- 7040.85) -14.2%
bench_unescape_c_str_non_ascii 76833.2 ns/iter (+/- 925.05) 62701.57 ns/iter (+/- 169.42) -18.4%
bench_unescape_c_str_unicode 262831.82 ns/iter (+/- 972.51) 213803.75 ns/iter (+/- 625.26) -18.7%
bench_unescape_c_str_unicode_escape 185955.28 ns/iter (+/- 1732.51) 163486.75 ns/iter (+/- 641.41) -12.1%
bench_unescape_str_ascii 45088.81 ns/iter (+/- 324.68) 45127.8 ns/iter (+/- 84.89) 0.1%
bench_unescape_str_ascii_escape 67136.64 ns/iter (+/- 437.04) 65999.89 ns/iter (+/- 418.29) -1.7%
bench_unescape_str_hex_escape 103124.07 ns/iter (+/- 296.07) 101489.16 ns/iter (+/- 927.54) -1.6%
bench_unescape_str_mixed_escape 742458.35 ns/iter (+/- 4591.73) 729269.3 ns/iter (+/- 5127.74) -1.8%
bench_unescape_str_non_ascii 63100.61 ns/iter (+/- 156.42) 63314.37 ns/iter (+/- 526.48) 0.3%
bench_unescape_str_unicode 217618.15 ns/iter (+/- 1489.77) 216865.7 ns/iter (+/- 1687.46) -0.3%
bench_unescape_str_unicode_escape 348800.22 ns/iter (+/- 1227.2) 348860.6 ns/iter (+/- 1171.6) 0.0%

@GuillaumeGomez
Copy link
Member

Surprisingly, bench_check_raw_str_ascii and bench_check_raw_c_str_ascii have opposite results between ARM and x86_64. This is quite surprising...

Ok(b)
}

/// Converts the result of a unicode escape to the unit type
Copy link
Member

Choose a reason for hiding this comment

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

Also please keep the doc comment, always useful. ;)

Copy link
Member Author

Choose a reason for hiding this comment

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

The doc comment is still there on the function def in the trait, so repeating it 3 times seems silly.

Copy link
Member

Choose a reason for hiding this comment

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

Ah I see, then please ignore my comment.

@hkBst
Copy link
Member Author

hkBst commented Jun 24, 2025

Surprisingly, bench_check_raw_str_ascii and bench_check_raw_c_str_ascii have opposite results between ARM and x86_64. This is quite surprising...

Not to mention unfortunate :(. How are the results without the inline on Check::check_raw?

@GuillaumeGomez
Copy link
Member

Without #[inline] on check_raw:

bench name current new diff
bench_check_raw_byte_str_ascii 20981.4 ns/iter (+/- 135.28) 21090.74 ns/iter (+/- 276.77) 0.5%
bench_check_raw_c_str_ascii 20211.42 ns/iter (+/- 183.14) 19891.92 ns/iter (+/- 144.99) -1.6%
bench_check_raw_c_str_non_ascii 37309.25 ns/iter (+/- 114.57) 37296.41 ns/iter (+/- 53.76) -0.0%
bench_check_raw_c_str_unicode 115142.48 ns/iter (+/- 372.21) 115074.2 ns/iter (+/- 239.83) -0.1%
bench_check_raw_str_ascii 19809.29 ns/iter (+/- 161.1) 19765.14 ns/iter (+/- 118.46) -0.2%
bench_check_raw_str_non_ascii 35865.43 ns/iter (+/- 256.63) 35863.27 ns/iter (+/- 58.88) -0.0%
bench_check_raw_str_unicode 109692.54 ns/iter (+/- 550.81) 109725.76 ns/iter (+/- 140.05) 0.0%
bench_skip_ascii_whitespace 6312.68 ns/iter (+/- 32.45) 6312.12 ns/iter (+/- 49.04) -0.0%
bench_unescape_byte_str_ascii 43566.98 ns/iter (+/- 209.39) 43588.65 ns/iter (+/- 402.24) 0.0%
bench_unescape_byte_str_ascii_escape 49178.27 ns/iter (+/- 353.01) 48931.33 ns/iter (+/- 82.93) -0.5%
bench_unescape_byte_str_hex_escape 78667.8 ns/iter (+/- 282.88) 77383.93 ns/iter (+/- 188.63) -1.6%
bench_unescape_byte_str_mixed_escape 217520.7 ns/iter (+/- 1520.05) 183873.56 ns/iter (+/- 5634.67) -15.5%
bench_unescape_c_str_ascii 54195.09 ns/iter (+/- 123.4) 44334.05 ns/iter (+/- 223.22) -18.2%
bench_unescape_c_str_ascii_escape 66276.77 ns/iter (+/- 109.18) 50598.32 ns/iter (+/- 497.69) -23.7%
bench_unescape_c_str_hex_escape_ascii 105982.1 ns/iter (+/- 120.61) 71303.51 ns/iter (+/- 196.57) -32.7%
bench_unescape_c_str_hex_escape_byte 106380.56 ns/iter (+/- 123.43) 84936.7 ns/iter (+/- 130.66) -20.2%
bench_unescape_c_str_mixed_escape 649576.85 ns/iter (+/- 1138.18) 466913.0 ns/iter (+/- 2724.91) -28.1%
bench_unescape_c_str_non_ascii 76737.69 ns/iter (+/- 179.73) 62597.69 ns/iter (+/- 140.9) -18.4%
bench_unescape_c_str_unicode 262577.85 ns/iter (+/- 4710.2) 179825.0 ns/iter (+/- 504.38) -31.5%
bench_unescape_c_str_unicode_escape 185982.98 ns/iter (+/- 1103.9) 137089.76 ns/iter (+/- 1342.66) -26.3%
bench_unescape_str_ascii 45042.83 ns/iter (+/- 160.21) 37965.58 ns/iter (+/- 478.26) -15.7%
bench_unescape_str_ascii_escape 66993.22 ns/iter (+/- 108.06) 65877.42 ns/iter (+/- 288.26) -1.7%
bench_unescape_str_hex_escape 102749.9 ns/iter (+/- 168.45) 85299.47 ns/iter (+/- 258.08) -17.0%
bench_unescape_str_mixed_escape 743884.0 ns/iter (+/- 6745.45) 731668.8 ns/iter (+/- 4520.42) -1.6%
bench_unescape_str_non_ascii 63224.91 ns/iter (+/- 154.62) 63272.99 ns/iter (+/- 165.15) 0.1%
bench_unescape_str_unicode 217410.27 ns/iter (+/- 8691.16) 217262.47 ns/iter (+/- 528.02) -0.1%
bench_unescape_str_unicode_escape 348887.38 ns/iter (+/- 1659.37) 345126.85 ns/iter (+/- 5549.16) -1.1%

I didn't expect the difference to be this big. O.o

@hkBst
Copy link
Member Author

hkBst commented Jun 24, 2025

#[cfg_attr(any(target_arch = "aarch64", target_arch = "arm"), inline)] to the rescue? Can you recheck x86-64?

src/lib.rs Outdated
/// which are returned via `callback`.
///
/// NOTE: Does no escaping, but produces errors for bare carriage return ('\r').
#[cfg_attr(any(target_arch = "aarch64", target_arch = "arm"), inline)]
Copy link
Member

Choose a reason for hiding this comment

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

Instead of having a cfg_attr, what are the results without this attribute on ARM? If they're not too bad, I think it'd be better to not start having conditional inlining for potential performance improvement (which might change any time).

Copy link
Member Author

Choose a reason for hiding this comment

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

Basically this is the only inline that generates all the performance wins on arm...

Copy link
Member

Choose a reason for hiding this comment

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

Ah. Ok, then please add a comment explaining why we have this attribute and what to check if it needs to be updated.

In the meantime, runnning benches with this new change.

Copy link
Member Author

Choose a reason for hiding this comment

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

Hmm, maybe I misremembered slightly, as there are some small wins:

bench name current new diff
bench_check_raw_byte_str_ascii 44628.4 ns/iter (+/- 102.2) 44629.32 ns/iter (+/- 73.66) 0.0%
bench_check_raw_c_str_ascii 41234.96 ns/iter (+/- 121.9) 41071.26 ns/iter (+/- 47.96) -0.4%
bench_check_raw_c_str_non_ascii 52474.5 ns/iter (+/- 72.77) 52578.81 ns/iter (+/- 115.4) 0.2%
bench_check_raw_c_str_unicode 174637.42 ns/iter (+/- 1521.31) 173704.05 ns/iter (+/- 1150.51) -0.5%
bench_check_raw_str_ascii 40644.14 ns/iter (+/- 93.49) 40668.03 ns/iter (+/- 91.28) 0.1%
bench_check_raw_str_non_ascii 50437.34 ns/iter (+/- 81.88) 50439.37 ns/iter (+/- 92.4) 0.0%
bench_check_raw_str_unicode 167964.36 ns/iter (+/- 613.95) 168088.36 ns/iter (+/- 368.93) 0.1%
bench_skip_ascii_whitespace 13081.61 ns/iter (+/- 31.3) 13095.27 ns/iter (+/- 14.95) 0.1%
bench_unescape_byte_str_ascii 68916.92 ns/iter (+/- 168.16) 69179.61 ns/iter (+/- 393.16) 0.4%
bench_unescape_byte_str_ascii_escape 81236.48 ns/iter (+/- 177.29) 81247.42 ns/iter (+/- 180.38) 0.0%
bench_unescape_byte_str_hex_escape 125728.99 ns/iter (+/- 256.18) 125697.59 ns/iter (+/- 253.15) -0.0%
bench_unescape_byte_str_mixed_escape 348869.9 ns/iter (+/- 2290.38) 348345.55 ns/iter (+/- 1578.4) -0.2%
bench_unescape_c_str_ascii 81575.56 ns/iter (+/- 180.46) 76510.93 ns/iter (+/- 237.2) -6.2%
bench_unescape_c_str_ascii_escape 96108.78 ns/iter (+/- 1281.04) 97554.84 ns/iter (+/- 160.5) 1.5%
bench_unescape_c_str_hex_escape_ascii 161725.35 ns/iter (+/- 1096.9) 153620.12 ns/iter (+/- 295.55) -5.0%
bench_unescape_c_str_hex_escape_byte 162388.73 ns/iter (+/- 504.69) 149612.35 ns/iter (+/- 236.66) -7.9%
bench_unescape_c_str_mixed_escape 1045466.2 ns/iter (+/- 5675.85) 1016333.3 ns/iter (+/- 2407.72) -2.8%
bench_unescape_c_str_non_ascii 110547.5 ns/iter (+/- 327.76) 95382.77 ns/iter (+/- 314.99) -13.7%
bench_unescape_c_str_unicode 385332.7 ns/iter (+/- 2524.07) 341268.3 ns/iter (+/- 1450.59) -11.4%
bench_unescape_c_str_unicode_escape 308526.52 ns/iter (+/- 1321.49) 310357.6 ns/iter (+/- 709.15) 0.6%
bench_unescape_str_ascii 77139.01 ns/iter (+/- 175.61) 73224.7 ns/iter (+/- 185.46) -5.1%
bench_unescape_str_ascii_escape 105477.82 ns/iter (+/- 313.16) 103074.02 ns/iter (+/- 1257.79) -2.3%
bench_unescape_str_hex_escape 165270.16 ns/iter (+/- 577.06) 165128.7 ns/iter (+/- 629.91) -0.1%
bench_unescape_str_mixed_escape 906241.1 ns/iter (+/- 2452.01) 905221.2 ns/iter (+/- 2022.47) -0.1%
bench_unescape_str_non_ascii 98002.09 ns/iter (+/- 341.61) 97892.88 ns/iter (+/- 267.58) -0.1%
bench_unescape_str_unicode 344989.9 ns/iter (+/- 651.18) 343551.35 ns/iter (+/- 1453.84) -0.4%
bench_unescape_str_unicode_escape 596409.25 ns/iter (+/- 2117.97) 595745.65 ns/iter (+/- 2342.47) -0.1%

Copy link
Member

Choose a reason for hiding this comment

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

Here are the results:

bench name current new diff
bench_check_raw_byte_str_ascii 20597.79 ns/iter (+/- 111.91) 21108.64 ns/iter (+/- 682.89) 2.5%
bench_check_raw_c_str_ascii 20242.44 ns/iter (+/- 35.66) 20105.08 ns/iter (+/- 72.01) -0.7%
bench_check_raw_c_str_non_ascii 37288.94 ns/iter (+/- 60.57) 37305.4 ns/iter (+/- 67.56) 0.0%
bench_check_raw_c_str_unicode 115247.8 ns/iter (+/- 267.7) 115218.52 ns/iter (+/- 222.48) -0.0%
bench_check_raw_str_ascii 19811.75 ns/iter (+/- 34.42) 19775.9 ns/iter (+/- 38.97) -0.2%
bench_check_raw_str_non_ascii 35882.4 ns/iter (+/- 120.81) 35862.94 ns/iter (+/- 37.65) -0.1%
bench_check_raw_str_unicode 109795.61 ns/iter (+/- 318.02) 109668.07 ns/iter (+/- 252.03) -0.1%
bench_skip_ascii_whitespace 6310.7 ns/iter (+/- 29.53) 6316.3 ns/iter (+/- 18.24) 0.1%
bench_unescape_byte_str_ascii 43636.65 ns/iter (+/- 193.89) 43529.61 ns/iter (+/- 168.8) -0.2%
bench_unescape_byte_str_ascii_escape 49115.14 ns/iter (+/- 81.32) 49232.31 ns/iter (+/- 355.52) 0.2%
bench_unescape_byte_str_hex_escape 78711.55 ns/iter (+/- 203.76) 77679.72 ns/iter (+/- 126.33) -1.3%
bench_unescape_byte_str_mixed_escape 217949.42 ns/iter (+/- 396.08) 182727.73 ns/iter (+/- 5340.48) -16.2%
bench_unescape_c_str_ascii 54202.44 ns/iter (+/- 213.68) 37968.36 ns/iter (+/- 1634.7) -30.0%
bench_unescape_c_str_ascii_escape 66313.15 ns/iter (+/- 295.46) 59751.49 ns/iter (+/- 347.79) -9.9%
bench_unescape_c_str_hex_escape_ascii 105983.81 ns/iter (+/- 316.38) 85106.36 ns/iter (+/- 643.56) -19.7%
bench_unescape_c_str_hex_escape_byte 106426.81 ns/iter (+/- 285.65) 85051.97 ns/iter (+/- 328.0) -20.1%
bench_unescape_c_str_mixed_escape 649798.95 ns/iter (+/- 2989.2) 557485.15 ns/iter (+/- 10110.31) -14.2%
bench_unescape_c_str_non_ascii 76784.48 ns/iter (+/- 356.41) 62791.62 ns/iter (+/- 244.16) -18.2%
bench_unescape_c_str_unicode 262566.75 ns/iter (+/- 3679.59) 214002.85 ns/iter (+/- 3932.69) -18.5%
bench_unescape_c_str_unicode_escape 185377.66 ns/iter (+/- 621.7) 163651.8 ns/iter (+/- 935.65) -11.7%
bench_unescape_str_ascii 44971.66 ns/iter (+/- 349.02) 45062.01 ns/iter (+/- 312.33) 0.2%
bench_unescape_str_ascii_escape 66951.3 ns/iter (+/- 347.23) 66292.56 ns/iter (+/- 137.83) -1.0%
bench_unescape_str_hex_escape 102903.64 ns/iter (+/- 173.36) 101440.36 ns/iter (+/- 282.0) -1.4%
bench_unescape_str_mixed_escape 743504.7 ns/iter (+/- 2975.47) 732506.6 ns/iter (+/- 5604.11) -1.5%
bench_unescape_str_non_ascii 63212.57 ns/iter (+/- 183.07) 63535.35 ns/iter (+/- 103.64) 0.5%
bench_unescape_str_unicode 217130.85 ns/iter (+/- 427.54) 217462.52 ns/iter (+/- 837.24) 0.2%
bench_unescape_str_unicode_escape 348727.47 ns/iter (+/- 569.06) 349065.45 ns/iter (+/- 4820.3) 0.1%

Not many changes, so all good. :)

Copy link
Member

Choose a reason for hiding this comment

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

Just saw your comment. Well now all platforms have comparable numbers, that's good! Let me write a summary at the end.

Copy link
Member Author

Choose a reason for hiding this comment

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

I've taken this out for now, to leave only uncontroversial cases of inline.

@GuillaumeGomez
Copy link
Member

Summary:

bench name x86_64 ARM
bench_check_raw_byte_str_ascii 2.5% 0%
bench_check_raw_c_str_ascii -0.7% -0.4%
bench_check_raw_c_str_non_ascii 0.0% 0.2%
bench_check_raw_c_str_unicode -0.0% -0.5%
bench_check_raw_str_ascii -0.2% 0.1%
bench_check_raw_str_non_ascii -0.1% 0%
bench_check_raw_str_unicode -0.1% 0.1%
bench_skip_ascii_whitespace 0.1% 0.1%
bench_unescape_byte_str_ascii -0.2% 0.4%
bench_unescape_byte_str_ascii_escape 0.2% 0%
bench_unescape_byte_str_hex_escape -1.3% 0%
bench_unescape_byte_str_mixed_escape -16.2% -0.2%
bench_unescape_c_str_ascii -30.0% -6.2%
bench_unescape_c_str_ascii_escape -9.9% 1.5%
bench_unescape_c_str_hex_escape_ascii -19.7% -5%
bench_unescape_c_str_hex_escape_byte -20.1% -7.9%
bench_unescape_c_str_mixed_escape -14.2% -2.8%
bench_unescape_c_str_non_ascii -18.2% -13.7%
bench_unescape_c_str_unicode -18.5% -11.4%
bench_unescape_c_str_unicode_escape -11.7% 0.6%
bench_unescape_str_ascii 0.2% -5.1%
bench_unescape_str_ascii_escape -1.0% -2.3%
bench_unescape_str_hex_escape -1.4% -0.1%
bench_unescape_str_mixed_escape -1.5% -0.1%
bench_unescape_str_non_ascii 0.5% -0.1%
bench_unescape_str_unicode 0.2% -0.4%
bench_unescape_str_unicode_escape 0.1% 0.1%

Seems all good to me, thanks for the performance improvement!

@GuillaumeGomez
Copy link
Member

cc @Urgau :)

@GuillaumeGomez
Copy link
Member

Or I can try @estebank. Can you merge please? :)

Copy link
Member

@Urgau Urgau left a comment

Choose a reason for hiding this comment

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

Looks fine.

@Urgau Urgau merged commit 5841236 into rust-lang:main Jun 24, 2025
2 checks passed
@hkBst hkBst deleted the inline-main branch June 25, 2025 05:14
@GuillaumeGomez GuillaumeGomez mentioned this pull request Jul 4, 2025
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.

3 participants