One of the reasons is that libdispatch's I/O functions introduce extra dynamic allocations for internal queueing via `dispatch_async` ([0],[1],[2]) and from an API perspective of realloc-ing [3] an internally owned [4] buffer.
TigerBeetle, on the other hand, statically allocates all I/O buffers upfront [5], treats these buffers as intrusively-provided typed data [6] (no growing/owned buffers), and does internal queueing without synchronization or dynamic allocation [7].
One of the reasons is that libdispatch's I/O functions introduce extra dynamic allocations for internal queueing via `dispatch_async` ([0],[1],[2]) and from an API perspective of realloc-ing [3] an internally owned [4] buffer.
TigerBeetle, on the other hand, statically allocates all I/O buffers upfront [5], treats these buffers as intrusively-provided typed data [6] (no growing/owned buffers), and does internal queueing without synchronization or dynamic allocation [7].
[0]: https://github.com/apple/swift-corelibs-libdispatch/blob/469...
[1]: https://github.com/apple/swift-corelibs-libdispatch/blob/469...
[2]: https://github.com/apple/swift-corelibs-libdispatch/blob/469...
[3]: https://github.com/apple/swift-corelibs-libdispatch/blob/469...
[4]: https://developer.apple.com/documentation/dispatch/1388933-d...
[5]: https://tigerbeetle.com/blog/a-database-without-dynamic-memo...
[6]: https://github.com/tigerbeetledb/tigerbeetle/blob/d15acc663f...
[7]: https://github.com/tigerbeetledb/tigerbeetle/d15acc663f8882c...