spdlog-rs icon indicating copy to clipboard operation
spdlog-rs copied to clipboard

Replace `write!()` for integers with `write_str` using `numtoa` crate

Open SpriteOvO opened this issue 2 months ago • 2 comments

Closes #98.

Since the author of itoa decided not to support leading zeros (https://github.com/dtolnay/itoa/issues/61#issuecomment-3341925250), we will only experiment with numtoa to see if there is any performance improvement and decide to use it or not.

I will benchmark this PR on a real machine tomorrow.

Self-reminder

This PR uses the numtoa I forked, so merge this after the upstream PR mmstick/numtoa#40 is merged and released.

SpriteOvO avatar Sep 27 '25 17:09 SpriteOvO

Before

test bench_1_file               ... bench:         195.69 ns/iter (+/- 13.53)
test bench_2_file_async         ... bench:         243.52 ns/iter (+/- 15.84)
test bench_3_rotating_file_size ... bench:         197.99 ns/iter (+/- 35.30)
test bench_4_rotating_daily     ... bench:         196.43 ns/iter (+/- 13.12)
test bench_5_level_off          ... bench:           1.40 ns/iter (+/- 0.04)

test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured; 0 filtered out; finished in 17.11s
test bench_1_full_formatter       ... bench:          83.51 ns/iter (+/- 5.01)
test bench_1_json_formatter       ... bench:         166.04 ns/iter (+/- 15.92)
test bench_2_full_pattern_ct      ... bench:         138.17 ns/iter (+/- 11.80)
test bench_3_full_pattern_rt      ... bench:         140.68 ns/iter (+/- 10.16)
test bench_4_ct_am_pm             ... bench:          60.71 ns/iter (+/- 2.18)
test bench_4_ct_column            ... bench:          38.33 ns/iter (+/- 3.50)
test bench_4_ct_date              ... bench:          75.19 ns/iter (+/- 8.07)
test bench_4_ct_date_short        ... bench:          73.92 ns/iter (+/- 7.21)
test bench_4_ct_datetime          ... bench:          91.50 ns/iter (+/- 10.28)
test bench_4_ct_day               ... bench:          64.51 ns/iter (+/- 5.75)
test bench_4_ct_eol               ... bench:          36.24 ns/iter (+/- 2.75)
test bench_4_ct_file              ... bench:          37.86 ns/iter (+/- 2.27)
test bench_4_ct_file_name         ... bench:          35.97 ns/iter (+/- 1.40)
test bench_4_ct_full              ... bench:          96.20 ns/iter (+/- 8.89)
test bench_4_ct_hour              ... bench:          64.49 ns/iter (+/- 5.04)
test bench_4_ct_hour_12           ... bench:          64.62 ns/iter (+/- 6.27)
test bench_4_ct_level             ... bench:          39.62 ns/iter (+/- 5.53)
test bench_4_ct_level_short       ... bench:          39.39 ns/iter (+/- 0.55)
test bench_4_ct_line              ... bench:          38.33 ns/iter (+/- 2.99)
test bench_4_ct_logger            ... bench:          38.95 ns/iter (+/- 1.88)
test bench_4_ct_microsecond       ... bench:          80.18 ns/iter (+/- 19.34)
test bench_4_ct_millsecond        ... bench:          73.10 ns/iter (+/- 4.69)
test bench_4_ct_minute            ... bench:          62.51 ns/iter (+/- 5.27)
test bench_4_ct_module_path       ... bench:          38.88 ns/iter (+/- 3.48)
test bench_4_ct_month             ... bench:          64.16 ns/iter (+/- 4.57)
test bench_4_ct_month_name        ... bench:          65.89 ns/iter (+/- 5.02)
test bench_4_ct_month_name_full   ... bench:          61.89 ns/iter (+/- 2.24)
test bench_4_ct_nanosecond        ... bench:          79.60 ns/iter (+/- 8.04)
test bench_4_ct_payload           ... bench:          39.04 ns/iter (+/- 3.69)
test bench_4_ct_pid               ... bench:          54.29 ns/iter (+/- 8.43)
test bench_4_ct_second            ... bench:          63.32 ns/iter (+/- 8.40)
test bench_4_ct_source            ... bench:          38.00 ns/iter (+/- 3.07)
test bench_4_ct_tid               ... bench:          52.84 ns/iter (+/- 3.61)
test bench_4_ct_time              ... bench:          76.61 ns/iter (+/- 0.57)
test bench_4_ct_time_12           ... bench:          75.41 ns/iter (+/- 4.64)
test bench_4_ct_time_short        ... bench:          65.90 ns/iter (+/- 3.46)
test bench_4_ct_tz_offset         ... bench:          63.68 ns/iter (+/- 5.39)
test bench_4_ct_unix_timestamp    ... bench:          64.09 ns/iter (+/- 5.41)
test bench_4_ct_weekday_name      ... bench:          64.54 ns/iter (+/- 5.23)
test bench_4_ct_weekday_name_full ... bench:          63.59 ns/iter (+/- 13.02)
test bench_4_ct_year              ... bench:          64.11 ns/iter (+/- 5.08)
test bench_4_ct_year_short        ... bench:          65.96 ns/iter (+/- 2.07)
test bench_5_rt_am_pm             ... bench:          68.51 ns/iter (+/- 2.57)
test bench_5_rt_column            ... bench:          41.60 ns/iter (+/- 5.33)
test bench_5_rt_date              ... bench:          78.67 ns/iter (+/- 4.34)
test bench_5_rt_date_short        ... bench:          76.34 ns/iter (+/- 4.71)
test bench_5_rt_datetime          ... bench:          96.80 ns/iter (+/- 4.42)
test bench_5_rt_day               ... bench:          68.85 ns/iter (+/- 0.69)
test bench_5_rt_eol               ... bench:          38.12 ns/iter (+/- 2.01)
test bench_5_rt_file              ... bench:          40.00 ns/iter (+/- 4.37)
test bench_5_rt_file_name         ... bench:          39.45 ns/iter (+/- 1.58)
test bench_5_rt_full              ... bench:         104.59 ns/iter (+/- 29.35)
test bench_5_rt_hour              ... bench:          67.53 ns/iter (+/- 5.98)
test bench_5_rt_hour_12           ... bench:          65.05 ns/iter (+/- 8.57)
test bench_5_rt_level             ... bench:          41.95 ns/iter (+/- 3.79)
test bench_5_rt_level_short       ... bench:          40.64 ns/iter (+/- 4.11)
test bench_5_rt_line              ... bench:          39.84 ns/iter (+/- 2.27)
test bench_5_rt_logger            ... bench:          39.57 ns/iter (+/- 1.60)
test bench_5_rt_microsecond       ... bench:          78.39 ns/iter (+/- 4.44)
test bench_5_rt_millsecond        ... bench:          78.98 ns/iter (+/- 13.18)
test bench_5_rt_minute            ... bench:          68.98 ns/iter (+/- 2.88)
test bench_5_rt_module_path       ... bench:          38.51 ns/iter (+/- 4.41)
test bench_5_rt_month             ... bench:          63.72 ns/iter (+/- 3.06)
test bench_5_rt_month_name        ... bench:          65.27 ns/iter (+/- 5.83)
test bench_5_rt_month_name_full   ... bench:          65.77 ns/iter (+/- 3.73)
test bench_5_rt_nanosecond        ... bench:          81.23 ns/iter (+/- 3.46)
test bench_5_rt_payload           ... bench:          42.51 ns/iter (+/- 4.69)
test bench_5_rt_pid               ... bench:          57.29 ns/iter (+/- 5.54)
test bench_5_rt_second            ... bench:          67.42 ns/iter (+/- 5.39)
test bench_5_rt_source            ... bench:          39.34 ns/iter (+/- 1.65)
test bench_5_rt_tid               ... bench:          53.23 ns/iter (+/- 5.38)
test bench_5_rt_time              ... bench:          76.06 ns/iter (+/- 14.06)
test bench_5_rt_time_12           ... bench:          77.75 ns/iter (+/- 3.35)
test bench_5_rt_time_short        ... bench:          73.13 ns/iter (+/- 8.43)
test bench_5_rt_tz_offset         ... bench:          68.19 ns/iter (+/- 5.45)
test bench_5_rt_unix_timestamp    ... bench:          66.28 ns/iter (+/- 4.74)
test bench_5_rt_weekday_name      ... bench:          63.58 ns/iter (+/- 2.88)
test bench_5_rt_weekday_name_full ... bench:          67.71 ns/iter (+/- 2.54)
test bench_5_rt_year              ... bench:          67.61 ns/iter (+/- 4.07)
test bench_5_rt_year_short        ... bench:          64.77 ns/iter (+/- 3.79)

test result: ok. 0 passed; 0 failed; 0 ignored; 80 measured; 0 filtered out; finished in 40.87s

After

test bench_1_file               ... bench:         189.57 ns/iter (+/- 10.78)
test bench_2_file_async         ... bench:         229.95 ns/iter (+/- 20.25)
test bench_3_rotating_file_size ... bench:         192.22 ns/iter (+/- 36.45)
test bench_4_rotating_daily     ... bench:         196.21 ns/iter (+/- 15.13)
test bench_5_level_off          ... bench:           1.18 ns/iter (+/- 0.08)

test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured; 0 filtered out; finished in 19.94s
test bench_1_full_formatter       ... bench:          81.42 ns/iter (+/- 6.23)
test bench_1_json_formatter       ... bench:         158.59 ns/iter (+/- 7.60)
test bench_2_full_pattern_ct      ... bench:         133.51 ns/iter (+/- 6.24)
test bench_3_full_pattern_rt      ... bench:         134.88 ns/iter (+/- 4.24)
test bench_4_ct_am_pm             ... bench:          64.14 ns/iter (+/- 3.74)
test bench_4_ct_column            ... bench:          38.07 ns/iter (+/- 1.73)
test bench_4_ct_date              ... bench:          77.01 ns/iter (+/- 1.24)
test bench_4_ct_date_short        ... bench:          74.72 ns/iter (+/- 6.27)
test bench_4_ct_datetime          ... bench:          91.03 ns/iter (+/- 11.50)
test bench_4_ct_day               ... bench:          62.40 ns/iter (+/- 3.50)
test bench_4_ct_eol               ... bench:          36.92 ns/iter (+/- 2.60)
test bench_4_ct_file              ... bench:          37.74 ns/iter (+/- 2.71)
test bench_4_ct_file_name         ... bench:          37.16 ns/iter (+/- 3.98)
test bench_4_ct_full              ... bench:          88.13 ns/iter (+/- 16.85)
test bench_4_ct_hour              ... bench:          64.53 ns/iter (+/- 2.61)
test bench_4_ct_hour_12           ... bench:          64.61 ns/iter (+/- 6.20)
test bench_4_ct_level             ... bench:          38.75 ns/iter (+/- 3.83)
test bench_4_ct_level_short       ... bench:          36.93 ns/iter (+/- 3.38)
test bench_4_ct_line              ... bench:          37.26 ns/iter (+/- 2.64)
test bench_4_ct_logger            ... bench:          39.33 ns/iter (+/- 2.34)
test bench_4_ct_microsecond       ... bench:          72.34 ns/iter (+/- 4.61)
test bench_4_ct_millsecond        ... bench:          73.38 ns/iter (+/- 6.22)
test bench_4_ct_minute            ... bench:          66.58 ns/iter (+/- 7.10)
test bench_4_ct_module_path       ... bench:          37.71 ns/iter (+/- 3.11)
test bench_4_ct_month             ... bench:          64.75 ns/iter (+/- 6.29)
test bench_4_ct_month_name        ... bench:          63.62 ns/iter (+/- 3.71)
test bench_4_ct_month_name_full   ... bench:          64.33 ns/iter (+/- 4.71)
test bench_4_ct_nanosecond        ... bench:          78.16 ns/iter (+/- 11.47)
test bench_4_ct_payload           ... bench:          40.35 ns/iter (+/- 3.08)
test bench_4_ct_pid               ... bench:          49.71 ns/iter (+/- 2.72)
test bench_4_ct_second            ... bench:          65.37 ns/iter (+/- 3.66)
test bench_4_ct_source            ... bench:          40.72 ns/iter (+/- 3.03)
test bench_4_ct_tid               ... bench:          48.33 ns/iter (+/- 2.81)
test bench_4_ct_time              ... bench:          79.01 ns/iter (+/- 2.31)
test bench_4_ct_time_12           ... bench:          81.32 ns/iter (+/- 2.97)
test bench_4_ct_time_short        ... bench:          70.70 ns/iter (+/- 1.68)
test bench_4_ct_tz_offset         ... bench:          65.55 ns/iter (+/- 6.20)
test bench_4_ct_unix_timestamp    ... bench:          64.96 ns/iter (+/- 6.10)
test bench_4_ct_weekday_name      ... bench:          64.89 ns/iter (+/- 4.82)
test bench_4_ct_weekday_name_full ... bench:          61.20 ns/iter (+/- 3.93)
test bench_4_ct_year              ... bench:          64.38 ns/iter (+/- 7.70)
test bench_4_ct_year_short        ... bench:          63.08 ns/iter (+/- 4.40)
test bench_5_rt_am_pm             ... bench:          64.10 ns/iter (+/- 4.56)
test bench_5_rt_column            ... bench:          39.66 ns/iter (+/- 2.72)
test bench_5_rt_date              ... bench:          76.23 ns/iter (+/- 4.84)
test bench_5_rt_date_short        ... bench:          77.28 ns/iter (+/- 8.36)
test bench_5_rt_datetime          ... bench:          93.57 ns/iter (+/- 7.00)
test bench_5_rt_day               ... bench:          66.75 ns/iter (+/- 5.66)
test bench_5_rt_eol               ... bench:          40.22 ns/iter (+/- 3.44)
test bench_5_rt_file              ... bench:          40.89 ns/iter (+/- 4.90)
test bench_5_rt_file_name         ... bench:          39.95 ns/iter (+/- 2.66)
test bench_5_rt_full              ... bench:          95.05 ns/iter (+/- 5.41)
test bench_5_rt_hour              ... bench:          66.97 ns/iter (+/- 4.03)
test bench_5_rt_hour_12           ... bench:          65.81 ns/iter (+/- 6.01)
test bench_5_rt_level             ... bench:          41.43 ns/iter (+/- 3.01)
test bench_5_rt_level_short       ... bench:          38.85 ns/iter (+/- 3.14)
test bench_5_rt_line              ... bench:          40.07 ns/iter (+/- 2.22)
test bench_5_rt_logger            ... bench:          38.88 ns/iter (+/- 2.91)
test bench_5_rt_microsecond       ... bench:          76.23 ns/iter (+/- 3.93)
test bench_5_rt_millsecond        ... bench:          72.86 ns/iter (+/- 5.71)
test bench_5_rt_minute            ... bench:          67.34 ns/iter (+/- 8.39)
test bench_5_rt_module_path       ... bench:          39.34 ns/iter (+/- 2.21)
test bench_5_rt_month             ... bench:          66.18 ns/iter (+/- 3.28)
test bench_5_rt_month_name        ... bench:          66.66 ns/iter (+/- 6.73)
test bench_5_rt_month_name_full   ... bench:          68.75 ns/iter (+/- 7.72)
test bench_5_rt_nanosecond        ... bench:          77.68 ns/iter (+/- 4.22)
test bench_5_rt_payload           ... bench:          41.69 ns/iter (+/- 4.27)
test bench_5_rt_pid               ... bench:          50.46 ns/iter (+/- 3.49)
test bench_5_rt_second            ... bench:          65.08 ns/iter (+/- 5.42)
test bench_5_rt_source            ... bench:          41.49 ns/iter (+/- 2.13)
test bench_5_rt_tid               ... bench:          49.21 ns/iter (+/- 3.86)
test bench_5_rt_time              ... bench:          78.55 ns/iter (+/- 5.45)
test bench_5_rt_time_12           ... bench:          82.25 ns/iter (+/- 13.14)
test bench_5_rt_time_short        ... bench:          74.34 ns/iter (+/- 3.33)
test bench_5_rt_tz_offset         ... bench:          66.45 ns/iter (+/- 3.56)
test bench_5_rt_unix_timestamp    ... bench:          65.93 ns/iter (+/- 5.82)
test bench_5_rt_weekday_name      ... bench:          66.85 ns/iter (+/- 10.07)
test bench_5_rt_weekday_name_full ... bench:          65.56 ns/iter (+/- 4.89)
test bench_5_rt_year              ... bench:          66.90 ns/iter (+/- 2.78)
test bench_5_rt_year_short        ... bench:          66.56 ns/iter (+/- 3.48)

test result: ok. 0 passed; 0 failed; 0 ignored; 80 measured; 0 filtered out; finished in 47.06s

cargo -Vv

cargo -Vv
cargo 1.89.0 (c24e10642 2025-06-23)
release: 1.89.0
commit-hash: c24e1064277fe51ab72011e2612e556ac56addf7
commit-date: 2025-06-23
host: x86_64-pc-windows-msvc
libgit2: 1.9.0 (sys:0.20.2 vendored)
libcurl: 8.12.1-DEV (sys:0.4.80+curl-8.12.1 vendored ssl:Schannel)
os: Windows 10.0.19045 (Windows 10 Pro) [64-bit]     

SpriteOvO avatar Sep 28 '25 10:09 SpriteOvO

Okay, slightly improvement, since this doesn't affect any public API, so we are not in a hurry to include it in v0.5.0.

SpriteOvO avatar Sep 28 '25 10:09 SpriteOvO