[go: up one dir, main page]

Skip to content

df308/x9

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

X9

Note: I am currently working on v2.0 which will bring further performance gains and flexibility to the user at the (unfortunate) cost of breaking the current API. I expect to release v2.0 by September/October 2024 and for it to be the last major/API-breaking change to X9.

X9 is a low level high performance message passing library, based on a lock-free ring buffer implemented with atomic variables, for low latency multithreading work.
It allows for multiple producers/consumers to concurrently access the same underlying ring buffer and provides both spinning (busy loop) and non-blocking read and write functions.

The library is based on three concepts:

  • A message, which is a user defined struct.
  • A x9_inbox, which is where messages are both written to and read from.
  • A x9_node, which is an abstraction that unifies x9_inbox(es).

The library provides multiple functions to both read from and write to a x9_inbox, as the right choice depends on the user needs.
Refer to x9.h, where all public functions are properly documented and their use cases explained, and the examples folder for comprehensive examples of different architectures.

Enabling X9_DEBUG at compile time will print to stdout the reason why the functions x9_inbox_is_valid and x9_node_is_valid returned 'false' (if they indeed returned 'false'), or why x9_select_inbox_from_node did not return a valid x9_inbox.

To use the library just link with x9.c and include x9.h where necessary.

X9 is as generic, performant and intuitive as C allows, without forcing the user to any sort of build system preprocessor hell, pseudo-C macro based library, or worse.
It was originally written in the context of an high-frequency-trading system that this author developed, and was made public in June of 2023.
It is released under the BSD-2-Clause license, with the purpose of serving others and other programs.

Benchmarks

  • Single producer and single consumer transmitting 100M messages via a single x9_inbox.
  • Run on Intel 11900k (cpu and ram untuned).
  • Msg size expressed in bytes, and Inbox size in number of slots in the ring buffer.
  • (See /profiling for how to run your own tests)
Inbox size | Msg size | Time (secs) | Msgs/second
-------------------------------------------------
      1024 |       16 |        4.00 |      25.01M
      1024 |       32 |        4.03 |      24.82M
      1024 |       64 |        4.17 |      23.99M
-------------------------------------------------
      2048 |       16 |        3.90 |      25.63M
      2048 |       32 |        3.96 |      25.26M
      2048 |       64 |        4.09 |      24.43M
-------------------------------------------------
      4096 |       16 |        3.86 |      25.88M
      4096 |       32 |        3.92 |      25.50M
      4096 |       64 |        4.05 |      24.67M
-------------------------------------------------