martinohmann / hcl-rs

HCL parsing and encoding libraries for rust with serde support
Apache License 2.0
122 stars 14 forks source link

perf(parser): handle unescaping of escaped markers in parser code directly #251

Closed martinohmann closed 1 year ago

martinohmann commented 1 year ago

The changes in https://github.com/martinohmann/hcl-rs/pull/247 and https://github.com/martinohmann/hcl-rs/pull/249 enabled some improvements to the string parsing code which this change implements.

Namely, the unescaping of escaped template markers ($${ -> ${ and %%{ -> %{) is done directly when they are encountered now. This speeds up common cases quite a bit.

Before:

parse/hcl-edit/deeply_nested.tf
                        time:   [19.631 µs 19.647 µs 19.668 µs]
                        thrpt:  [35.929 MiB/s 35.968 MiB/s 35.997 MiB/s]
parse/hcl-edit/large.tf time:   [2.1344 ms 2.1389 ms 2.1445 ms]
                        thrpt:  [38.015 MiB/s 38.114 MiB/s 38.194 MiB/s]
parse/hcl-edit/medium.tf
                        time:   [449.06 µs 451.22 µs 453.42 µs]
                        thrpt:  [31.667 MiB/s 31.821 MiB/s 31.975 MiB/s]
parse/hcl-edit/small.tf time:   [27.485 µs 27.600 µs 27.744 µs]
                        thrpt:  [34.133 MiB/s 34.311 MiB/s 34.456 MiB/s]

After:

parse/hcl-edit/deeply_nested.tf
                        time:   [18.461 µs 18.488 µs 18.526 µs]
                        thrpt:  [38.146 MiB/s 38.223 MiB/s 38.280 MiB/s]
                 change:
                        time:   [-5.8990% -4.6557% -2.0981%] (p = 0.00 < 0.05)
                        thrpt:  [+2.1431% +4.8830% +6.2688%]
                        Performance has improved.
parse/hcl-edit/large.tf time:   [1.7640 ms 1.7699 ms 1.7787 ms]
                        thrpt:  [45.833 MiB/s 46.061 MiB/s 46.216 MiB/s]
                 change:
                        time:   [-17.613% -17.253% -16.777%] (p = 0.00 < 0.05)
                        thrpt:  [+20.160% +20.850% +21.379%]
                        Performance has improved.
parse/hcl-edit/medium.tf
                        time:   [407.78 µs 408.77 µs 409.99 µs]
                        thrpt:  [35.022 MiB/s 35.127 MiB/s 35.212 MiB/s]
                 change:
                        time:   [-9.9006% -9.4090% -8.9185%] (p = 0.00 < 0.05)
                        thrpt:  [+9.7918% +10.386% +10.988%]
                        Performance has improved.
parse/hcl-edit/small.tf time:   [24.139 µs 24.249 µs 24.385 µs]
                        thrpt:  [38.835 MiB/s 39.053 MiB/s 39.230 MiB/s]
                 change:
                        time:   [-12.375% -12.060% -11.751%] (p = 0.00 < 0.05)
                        thrpt:  [+13.316% +13.713% +14.123%]
                        Performance has improved.

Please note that I didn't bother to implement the same improvement for the hcl-rs parser because it will be removed in the future and then just uses hcl-edit under the hood for parsing.