Skip to content
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

Add a performant way to (de-)serialize fixed-size byte arrays #127

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Commits on Jan 27, 2024

  1. Add a performant way to (de-)serialize fixed-size byte arrays

    First observed in est31/serde-big-array#19,
    there's no performant way to serialize fixed-size byte arrays with
    serde/postcard.
    
    Add a `FixedSizeByteArray` type that can be used to serialize fixed-size
    byte arrays faster than all other available methods. This type only
    works with postcard. A more general solution would need to be
    implemented in serde itself.
    
    This works around serde-rs/serde#2680.
    
    ```
    serialize16/own                 [3.8846 ns 3.8909 ns 3.8988 ns]
    serialize16/bytes               [9.9192 ns 9.9503 ns 9.9907 ns]
    serialize16/byte_array          [4.1374 ns 4.1461 ns 4.1564 ns]
    serialize16/big_array           [68.245 ns 68.344 ns 68.454 ns]
    serialize16/fixed_size          [9.9966 ns 10.030 ns 10.076 ns]
    serialize16/variable_size       [15.696 ns 15.795 ns 15.898 ns]
    
    serialize32/own                 [4.1744 ns 4.1857 ns 4.2014 ns]
    serialize32/bytes               [9.6590 ns 9.6825 ns 9.7151 ns]
    serialize32/byte_array          [4.5584 ns 4.5663 ns 4.5747 ns]
    serialize32/big_array           [135.38 ns 135.78 ns 136.34 ns]
    serialize32/fixed_size          [13.989 ns 14.034 ns 14.091 ns]
    serialize32/variable_size       [21.223 ns 21.270 ns 21.328 ns]
    
    deserialize16/own               [5.9018 ns 5.9143 ns 5.9272 ns]
    deserialize16/bytes             [21.198 ns 21.278 ns 21.376 ns]
    deserialize16/byte_array        [6.8560 ns 6.8719 ns 6.8934 ns]
    deserialize16/big_array         [19.027 ns 19.098 ns 19.187 ns]
    deserialize16/fixed_size        [7.9197 ns 7.9471 ns 7.9817 ns]
    deserialize16/variable_size     [36.804 ns 36.871 ns 36.946 ns]
    
    deserialize32/own               [8.8860 ns 8.8989 ns 8.9139 ns]
    deserialize32/bytes             [21.241 ns 21.271 ns 21.321 ns]
    deserialize32/byte_array        [11.441 ns 11.459 ns 11.481 ns]
    deserialize32/big_array         [31.553 ns 31.618 ns 31.697 ns]
    deserialize32/fixed_size        [17.334 ns 17.360 ns 17.386 ns]
    deserialize32/variable_size     [59.705 ns 59.815 ns 59.949 ns]
    ```
    
    - `own` is the new `FixedSizeByteArray`, no length prefix.
    - `bytes` is `serde_bytes::Bytes`, it has a length prefix.
    - `byte_array` is `serde_byte_array::ByteArray`, it has a length prefix.
    - `big_array` is `serde_big_array::Array`, no length prefix.
    - `fixed_size` is `[u8; _]`, no length prefix.
    - `variable_size` is `[u8]`, it has a length prefix.
    hrxi committed Jan 27, 2024
    Configuration menu
    Copy the full SHA
    1f64c67 View commit details
    Browse the repository at this point in the history

Commits on Feb 1, 2024

  1. Move fixed size byte array stuff to tuple structs

    They're used less often in real code.
    hrxi committed Feb 1, 2024
    Configuration menu
    Copy the full SHA
    b0a07fd View commit details
    Browse the repository at this point in the history