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

feat: reuse buffer when serializing #160

Merged

Conversation

J-Loudet
Copy link
Contributor

These commits try to minimize the number of allocations performed when
serializing data. For this end, the connector and built-in Source now create
internal Vec<u8> buffers that are reused whenever a message is serialized.

This change should hopefully (slightly) improve performance.

This commit tries to minimize the number of allocations performed when
serializing data. For this end, the connector and built-in Source now create
internal `Vec<u8>` buffers that are reused whenever a message is serialized.

This change should hopefully improve performance.
@J-Loudet J-Loudet requested a review from gabrik April 28, 2023 10:01
@gabrik gabrik merged commit b6c669c into feat/support-custom-de-serializer Apr 28, 2023
@J-Loudet J-Loudet deleted the feat/reuse-serialization-buffers branch May 2, 2023 07:39
J-Loudet added a commit that referenced this pull request May 2, 2023
* feat: support for custom (de)serializer

This commit introduces the following changes to Zenoh-Flow:
1. types used within a Zenoh-Flow application do not have to implement the
   (cumbersome) `ZFData` trait; instead,
2. the types used must be `Send + Sync + 'static`,
3. an Output must know how to serialize the provided type `T` and, respectively,
   an Input must know how to deserialize bytes into `T`.

With these changes, any SerDe compatible data serialization format is supported
as well as, for instance, ProtoBuf.

In terms of API, the major difference is how the Input and Output are obtained:

```rust
input: inputs
    .take("in", |bytes| todo!("Provide your deserializer here"))
    .expect("No input called 'in' found"),

output: outputs
    .take("out", |data| todo!("Provide your serializer here"))
    .expect("No output called 'out' found"),
```

* fix: move `DeserializerFn` in types/message.rs

* fix: remove explicit call to `Arc::clone`

* fix: add `as_mut_any` on `SendSyncAny` trait

* fix: implement/derive Debug for the different messages

* feat: InputBuilder and OutputBuilder

Instead of having the methods `take` and `take_raw` on the Inputs and Outputs,
that give, respectively, the Typed and Raw Input/Output, this commit removes
the `take_raw` variant and introduces builders.

The builders can be turned into the Typed or Raw variant using the corresponding
methods: `build_typed` and `build_raw`.

* doc: improve documentation of Input / Output

* feat: reuse buffer when serializing (#160)

* feat: reuse buffer when serializing

This commit tries to minimize the number of allocations performed when
serializing data. For this end, the connector and built-in Source now create
internal `Vec<u8>` buffers that are reused whenever a message is serialized.

This change should hopefully improve performance.

* doc: fix typos

* refacto: renamed `build_raw` and `build_typed` to `raw` and `typed`

---------

Signed-off-by: Julien Loudet <julien.loudet@zettascale.tech>
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