-
Notifications
You must be signed in to change notification settings - Fork 11
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
C flatcc builder (put) optimization #8
Comments
Note: I'm not sure the copy could be avoided, considering how Maybe @mikkelfj has some suggestions? |
The copy can be avoided, to a degree: You can call a different version of finalize that accepts a fixed size buffer, and you can call yet another function to detect the size of the buffer required. However, the default backend emitter of the builder is collecting data in chained pages, not in contiguous memory, so this memory must be copied out in order to read the data as a buffer. And this data generally needs to be aligned to the largest alignment unit used in the buffer. Usually 8 bytes suffice, but If you want to further optimize, you can provide you own emitter backend. It is essentially a simple callback that receives an iovec array of small chunks of data to copy. There are a few emitter examples in the test directory. |
Another topic: are we able to reuse flatcc_builder_t? I don't recall if we can cache it. PS.: flatcc related optimizations can be done after 1.0 |
I can't answer that, but the mentioned list of chained pages will be recycled efficiently if you do cache the builder, and so will several internal stacks. You can control how much memory the builder retains between builds in case you have a large spike. See custom version of the reset call. |
Also see the discussion about an overload for generated _put() and _get() functions #11 (review) |
Also to keep in mind: there's an internal discussion/feature request for providing flatbuffers serialization as part of the C-API. It's mainly for other language bindings but it would also solve this issue (data copy), simplify the code generator (we could have the same code for C++ and C) and drop the C |
The generated code currently calls
flatcc_builder_finalize_aligned_buffer()
which returns a copy of the builder buffer. The returned buffer must be freed by callingflatcc_builder_aligned_free()
, in addition to freeing the builder usingflatcc_builder_clear()
. Have a look at the following sample from README.mdWe should have a look if/how we can optimize this, in terms of performance (avoiding the memory copy if possible) and usability.
The text was updated successfully, but these errors were encountered: