-
Notifications
You must be signed in to change notification settings - Fork 525
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
improve encode_varint performance by bounding its loop #940
improve encode_varint performance by bounding its loop #940
Conversation
here are the relevant benchmark outputs for my available machines, diffed with amd 7950x:
intel i7-6700:
intel i7-2760QM (this one's results are finicky):
amd 3975WX:
virtualized on EPYC 7713 (Linode):
...and contributed by others:
|
i have a macbook sitting around, with an intel i7-9750H:
the thermals on this laptop are a bit of a mess but i'm seeing a consistent regression, very interesting |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please rebase to latest master to fix CI
@@ -27,7 +27,7 @@ pub fn encode_varint<B>(mut value: u64, buf: &mut B) | |||
where | |||
B: BufMut, | |||
{ | |||
loop { | |||
for _ in 0..10 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you explain the constant 10? Maybe a static assert, formula or documentation?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is it not sufficiently covered by the comment already on this function? i can add it, just wondering
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, you are probably right. I saw that comment and started looking into why 10 bytes is correct. I took me a moment to understand.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
protobuf's varints are fairly thoroughly documented to be 10 bytes maximum, yes. i mean they could be 9 but they decided not to do that. i believe every minimal length protobuf varint that is 10 bytes always has 0x01 as its last byte value, which is rather a waste considering how many situations cause them to become maximum length this way. the burden of legacy i guess
0790edf
to
561fa9c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Thank you for your contribution |
_PROST!_ is a [Protocol Buffers](https://developers.google.com/protocol-buffers/) implementation for the [Rust Language](https://www.rust-lang.org/). `prost` generates simple, idiomatic Rust code from `proto2` and `proto3` files. This patch updates brings a few new features and fixes: - Bump MSRV to 1.70 (minimum supported Rust version) - Rename cargo feature `prost-derive` to `derive` (tokio-rs#992) - Add @generated comment on top of generated files (tokio-rs#935) - Optimize implementation of prost::Name when generated by prost-build (tokio-rs#956) ## Dependencies - build(deps): Allow itertools 0.12 (tokio-rs#948) - build(deps): Allow heck 0.5 (tokio-rs#1012) - build(deps): Allow multimap 0.10 (tokio-rs#1013) ## Documentation - Improve protoc not found error message (tokio-rs#937) - build: Add development container config (tokio-rs#949) - docs: Fixed README typos (tokio-rs#952 / tokio-rs#967 / tokio-rs#970) ## Internal - chore: Fix minimal versions (tokio-rs#920) - fix: fq_message_name should begin with one dot (tokio-rs#981) - improve encode_varint performance by bounding its loop (tokio-rs#940) - style: Remove duplicate function call (tokio-rs#989) - test: Improve test decode_varint_slow (tokio-rs#977) - chore: Add dep: prefix to feature dependencies (tokio-rs#919) - Minor clippy lint fixes. (tokio-rs#1006) - chore: Use taiki-e/install-action to setup cargo-machete (tokio-rs#909) - chore: Remove which dependency. (tokio-rs#962) - chore: Update to actions/checkout@v4 (tokio-rs#910) ``` $ cargo semver-checks --workspace Parsing prost v0.12.4 (current) Parsed [ 4.348s] (current) Parsing prost v0.12.3 (baseline, cached) Parsed [ 0.099s] (baseline) Checking prost v0.12.3 -> v0.12.4 (minor change) Checked [ 0.029s] 61 checks; 61 passed, 6 unnecessary Finished [ 4.481s] prost Parsing prost-build v0.12.4 (current) Parsed [ 5.488s] (current) Parsing prost-build v0.12.3 (baseline) Parsed [ 3.819s] (baseline) Checking prost-build v0.12.3 -> v0.12.4 (minor change) Checked [ 0.005s] 61 checks; 61 passed, 6 unnecessary Finished [ 9.319s] prost-build Parsing prost-types v0.12.4 (current) Parsed [ 3.150s] (current) Parsing prost-types v0.12.3 (baseline) Parsed [ 3.192s] (baseline) Checking prost-types v0.12.3 -> v0.12.4 (minor change) Checked [ 0.075s] 61 checks; 61 passed, 6 unnecessary Finished [ 6.434s] prost-types ```
_PROST!_ is a [Protocol Buffers](https://developers.google.com/protocol-buffers/) implementation for the [Rust Language](https://www.rust-lang.org/). `prost` generates simple, idiomatic Rust code from `proto2` and `proto3` files. This patch update brings new features and fixes: - Bump MSRV to 1.70 (minimum supported Rust version) - Rename cargo feature `prost-derive` to `derive` (tokio-rs#992) - Add @generated comment on top of generated files (tokio-rs#935) - Optimize implementation of prost::Name when generated by prost-build (tokio-rs#956) ## Dependencies - build(deps): Allow itertools 0.12 (tokio-rs#948) - build(deps): Allow heck 0.5 (tokio-rs#1012) - build(deps): Allow multimap 0.10 (tokio-rs#1013) ## Documentation - Improve protoc not found error message (tokio-rs#937) - build: Add development container config (tokio-rs#949) - docs: Fixed README typos (tokio-rs#952 / tokio-rs#967 / tokio-rs#970) ## Internal - chore: Fix minimal versions (tokio-rs#920) - fix: fq_message_name should begin with one dot (tokio-rs#981) - improve encode_varint performance by bounding its loop (tokio-rs#940) - style: Remove duplicate function call (tokio-rs#989) - test: Improve test decode_varint_slow (tokio-rs#977) - chore: Add dep: prefix to feature dependencies (tokio-rs#919) - Minor clippy lint fixes. (tokio-rs#1006) - chore: Use taiki-e/install-action to setup cargo-machete (tokio-rs#909) - chore: Remove which dependency. (tokio-rs#962) - chore: Update to actions/checkout@v4 (tokio-rs#910)
_PROST!_ is a [Protocol Buffers](https://developers.google.com/protocol-buffers/) implementation for the [Rust Language](https://www.rust-lang.org/). `prost` generates simple, idiomatic Rust code from `proto2` and `proto3` files. This patch update brings new features and fixes: - Bump MSRV to 1.70 (minimum supported Rust version) - Rename cargo feature `prost-derive` to `derive` (tokio-rs#992) - Add @generated comment on top of generated files (tokio-rs#935) - Optimize implementation of prost::Name when generated by prost-build (tokio-rs#956) ## Dependencies - build(deps): Allow itertools 0.12 (tokio-rs#948) - build(deps): Allow heck 0.5 (tokio-rs#1012) - build(deps): Allow multimap 0.10 (tokio-rs#1013) ## Documentation - Improve protoc not found error message (tokio-rs#937) - build: Add development container config (tokio-rs#949) - docs: Fixed README typos (tokio-rs#952 / tokio-rs#967 / tokio-rs#970) ## Internal - chore: Fix minimal versions (tokio-rs#920) - fix: fq_message_name should begin with one dot (tokio-rs#981) - improve encode_varint performance by bounding its loop (tokio-rs#940) - style: Remove duplicate function call (tokio-rs#989) - test: Improve test decode_varint_slow (tokio-rs#977) - chore: Add dep: prefix to feature dependencies (tokio-rs#919) - Minor clippy lint fixes. (tokio-rs#1006) - chore: Use taiki-e/install-action to setup cargo-machete (tokio-rs#909) - chore: Remove which dependency. (tokio-rs#962) - chore: Update to actions/checkout@v4 (tokio-rs#910)
_PROST!_ is a [Protocol Buffers](https://developers.google.com/protocol-buffers/) implementation for the [Rust Language](https://www.rust-lang.org/). `prost` generates simple, idiomatic Rust code from `proto2` and `proto3` files. This patch update brings new features and fixes: - Bump MSRV to 1.70 (minimum supported Rust version) - Rename cargo feature `prost-derive` to `derive` (#992) - Add @generated comment on top of generated files (#935) - Optimize implementation of prost::Name when generated by prost-build (#956) ## Dependencies - build(deps): Allow itertools 0.12 (#948) - build(deps): Allow heck 0.5 (#1012) - build(deps): Allow multimap 0.10 (#1013) ## Documentation - Improve protoc not found error message (#937) - build: Add development container config (#949) - docs: Fixed README typos (#952 / #967 / #970) ## Internal - chore: Fix minimal versions (#920) - fix: fq_message_name should begin with one dot (#981) - improve encode_varint performance by bounding its loop (#940) - style: Remove duplicate function call (#989) - test: Improve test decode_varint_slow (#977) - chore: Add dep: prefix to feature dependencies (#919) - Minor clippy lint fixes. (#1006) - chore: Use taiki-e/install-action to setup cargo-machete (#909) - chore: Remove which dependency. (#962) - chore: Update to actions/checkout@v4 (#910)
_PROST!_ is a [Protocol Buffers](https://developers.google.com/protocol-buffers/) implementation for the [Rust Language](https://www.rust-lang.org/). `prost` generates simple, idiomatic Rust code from `proto2` and `proto3` files. This patch update brings new features and fixes: - Bump MSRV to 1.70 (minimum supported Rust version) - Rename cargo feature `prost-derive` to `derive` (tokio-rs#992) - Add @generated comment on top of generated files (tokio-rs#935) - Optimize implementation of prost::Name when generated by prost-build (tokio-rs#956) ## Dependencies - build(deps): Allow itertools 0.12 (tokio-rs#948) - build(deps): Allow heck 0.5 (tokio-rs#1012) - build(deps): Allow multimap 0.10 (tokio-rs#1013) ## Documentation - Improve protoc not found error message (tokio-rs#937) - build: Add development container config (tokio-rs#949) - docs: Fixed README typos (tokio-rs#952 / tokio-rs#967 / tokio-rs#970) ## Internal - chore: Fix minimal versions (tokio-rs#920) - fix: fq_message_name should begin with one dot (tokio-rs#981) - improve encode_varint performance by bounding its loop (tokio-rs#940) - style: Remove duplicate function call (tokio-rs#989) - test: Improve test decode_varint_slow (tokio-rs#977) - chore: Add dep: prefix to feature dependencies (tokio-rs#919) - Minor clippy lint fixes. (tokio-rs#1006) - chore: Use taiki-e/install-action to setup cargo-machete (tokio-rs#909) - chore: Remove which dependency. (tokio-rs#962) - chore: Update to actions/checkout@v4 (tokio-rs#910)
I believe this is probably allowing the compiler to unroll the loop where it could not before by giving it a more easily provable bound. This has significant performance improvement for me in benchmarks (on two different processors: a 7-series AMD and an old intel mobile processor; break-even on 3-series threadripper); if we have a process for validating these on more machines we should go through it and get more info.