Skip to content

Conversation

@ypconstante
Copy link
Contributor

Today decode always converts numbers to strings and then back to number to make sure they are not out of range. We can check if they are in range to avoid this conversion, reducing memory usage.

##### With input google_message1_proto2 #####
Name                                                      ips        average  deviation         median         99th %
decode (optimize-decode-integer-0191397-decode)      445.61 K        2.24 μs  ±1292.99%        2.13 μs        3.18 μs
decode (main-4c7b3e8-decode)                         440.47 K        2.27 μs  ±1112.84%        2.16 μs        3.05 μs

Comparison: 
decode (optimize-decode-integer-0191397-decode)      445.61 K
decode (main-4c7b3e8-decode)                         440.47 K - 1.01x slower +0.0262 μs

Memory usage statistics:

Name                                               Memory usage
decode (optimize-decode-integer-0191397-decode)         2.91 KB
decode (main-4c7b3e8-decode)                            3.85 KB - 1.32x memory usage +0.94 KB

**All measurements for memory usage were the same**

##### With input google_message1_proto3 #####
Name                                                      ips        average  deviation         median         99th %
decode (main-4c7b3e8-decode)                         444.80 K        2.25 μs  ±1177.60%        2.13 μs        3.16 μs
decode (optimize-decode-integer-0191397-decode)      439.76 K        2.27 μs  ±1565.74%        2.13 μs        3.34 μs

Comparison: 
decode (main-4c7b3e8-decode)                         444.80 K
decode (optimize-decode-integer-0191397-decode)      439.76 K - 1.01x slower +0.0258 μs

Memory usage statistics:

Name                                               Memory usage
decode (main-4c7b3e8-decode)                            4.07 KB
decode (optimize-decode-integer-0191397-decode)         3.39 KB - 0.83x memory usage -0.67969 KB

**All measurements for memory usage were the same**

##### With input google_message2 #####
Name                                                      ips        average  deviation         median         99th %
decode (optimize-decode-integer-0191397-decode)       10.70 K       93.46 μs     ±5.33%       92.92 μs      100.43 μs
decode (main-4c7b3e8-decode)                          10.68 K       93.64 μs     ±6.57%       93.17 μs      100.37 μs

Comparison: 
decode (optimize-decode-integer-0191397-decode)       10.70 K
decode (main-4c7b3e8-decode)                          10.68 K - 1.00x slower +0.181 μs

Memory usage statistics:

Name                                                    average  deviation         median         99th %
decode (optimize-decode-integer-0191397-decode)        96.09 KB     ±0.01%       96.09 KB       96.09 KB
decode (main-4c7b3e8-decode)                           96.41 KB     ±0.01%       96.41 KB       96.41 KB

Comparison: 
decode (optimize-decode-integer-0191397-decode)        96.09 KB
decode (main-4c7b3e8-decode)                           96.41 KB - 1.00x memory usage +0.31 KB

@whatyouhide
Copy link
Collaborator

Can we leave a comment in the code documenting why we're doing this?

@ypconstante ypconstante force-pushed the optimize-decode-integer branch from d65b686 to 38425fc Compare January 5, 2026 13:22
@ypconstante
Copy link
Contributor Author

Added comments to roundtrip functions

@whatyouhide whatyouhide merged commit 56d2f95 into elixir-protobuf:main Jan 6, 2026
4 checks passed
@whatyouhide
Copy link
Collaborator

Thank you! 🫶

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