| King from TigerBeetle here. 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... |