Choose your test
What do you want to compare?
Parsing and encoding
Compare in-process message work with peers in the same language. See p50, tail percentiles and the top-five profiles.
Explore codec microbenchmarks →Complete FIX exchanges
Compare engines on the same machines, with matching messages, timing boundaries and rates. Check which comparisons are complete.
See full-session comparisons →Find a specific result
Filter recorded results by machine, engine, workload and transport. Inspect the original grades and source references.
Browse the result catalogue →How results qualify and what has changed
A full-session comparison must complete all four workloads on both sides, on the same machines, with matching timing and rate requirements. The detailed records use S5 for this qualification stage. A specific CPU profile names the processor allocation used for that test.
Qualification details
Current comparison status and corrections.
C++ callback CORE / NexusFIX retains its qualified two-rig comparison. Earlier Rust open / NanoFIX and TrueFix canonical figures are superseded: their clock spans omit required work. Original grades and data remain historical. A fresh corrected-clock Rust / NanoFIX comparison now passes all four flows on both rigs under the explicit first-CPU profile.
Actual Native and public managed .NET first-CPU configurations now each pass all four flows on both rigs, within one declared source/generation per host and configuration. The fresh inherited collections retain SCAN Native tick stability and managed mixed-rate failures. Older good cells remain available without completing a failed fresh collection; the completed .NET 10 / QuickFIX/n comparison remains blocked: only HP NOS/tick are admitted. The current Java Pure / Philadelphia-fast comparison admits HP MD/tick and no SCAN flow. Both complete two-rig language minima remain blocked. Inspect Native configurations → · Inspect public managed configurations →
Review per-rig gates and the correction record → · Current target roster by language (Markdown) → · Current coverage document → · All targets and source hashes (JSON) →
Latest codec comparison
25 adapters. Checked numeric field work.
The qualified HP microbenchmark campaign of 18 October 2026 passes 25 build/run gates and 332 isolated text/numeric probes at LibHFT source 5917330b7c2c. C++, Java and Rust each have five-engine CDFs; .NET has four measured peers and Go one. llfix encoding is ranked; its receive cells include SDK timestamp, sequence and callback work and stay unranked. Codec results are not full-session evidence.
Retained transport reference
Explore the retained transport reference.
The charts below use retained open-loop v4 results dated 20 September 2026. Newer tests refresh the source-bound configuration notes; the status badges in these reference tables retain their original campaign grades. Current matched decisions have their own source and clock bindings above. There is no replacement matched, passing five-engine physical-link campaign. Rates, hosts, functional smokes and qualified latency runs are kept separate.
Each measured cell used three 30-second windows after warm-up. The workload is NewOrderSingle → acknowledgement. Response time starts at the intended send slot and includes scheduling delay. Transport paths are separate selections, never each engine’s cherry-picked best path.
CDFs connect recorded percentile anchors, not raw empirical samples. Missing targets show no latency. Read the timing contract →
HP · kernel TCP · single session · 50,000 requests/s · retained NOS/ER reference.
Workload and measurement points
What does each test measure?
Expand a scenario to follow the FIX messages, locate t0/t1, and inspect a complete captured example for every leg. The shaded interval is timed; grey dashed work is excluded. These diagrams explain the tests, not their performance.
Swipe diagrams horizontally on a small screen, or open them at full size.
What this test measures: Order → acknowledgementnos_er · D → 8 · Client clock
Client clock: t1 − t0. Both timestamps belong to one endpoint; synchronized host clocks are not required.
- t0 · start
- Published transport reference: the intended send slot, before any scheduling delay. Canonical actual-start tests: immediately before order construction and the engine-specific send call.
- t1 · stop
- After the client parses the derived acknowledgement and completes the required business-field extraction and checks.
- Included
- Client order construction/send, both endpoints, the network, server order processing and acknowledgement construction, then client reply processing. The displayed open-loop reference also includes scheduler delay.
- Excluded
- Session establishment and warm-up are outside the headline samples. An acknowledgement is not a trade fill.
Compare the canonical actual-start boundary
Canonical nos_er starts immediately before construction/send, not at the intended schedule slot. Scheduling delay is a separate probe. Do not mix that service-time distribution with the displayed open-loop reference.
Captured sample FIX messages
One complete, correlated chain from the synthetic QuickFIX/C++ functional audit. These are actual captured bytes illustrating the current canonical wire shape, not messages from the older transport campaign or measured latency samples.
The acknowledgement echoes order 11=1, symbol LCOM1, buy side, quantity 1000 and price 10000.00000. ExecType 150=0 and OrdStatus 39=0 mean New: CumQty is 0, LeavesQty is 1000 and AvgPx is 0. No LastQty/LastPx fill fields are present.
| represents SOH (ASCII 0x01). Remove display line breaks and restore SOH to recover the exact message, including valid BodyLength (9) and CheckSum (10). FIX SendingTime (52) is a wall-clock field, not the monotonic measurement clock: do not subtract these timestamps to estimate latency. Tag 60 retains the fixed July fixture time.
Download the original synthetic wire capture → · Download all checked examples and source hashes →
What this test measures: Market-data request → full bookmd · V → W · Client clock
Client clock: t1 − t0. Both timestamps belong to one endpoint; synchronized host clocks are not required.
- t0 · start
- Immediately before constructing and sending the market-data request, at actual task start.
- t1 · stop
- After the client parses the full snapshot and completes the required book-field extraction and checks.
- Included
- Request construction/send, server request parsing and book construction, both network legs, and client parsing/checking of the ten-level snapshot.
- Excluded
- Session establishment and warm-up. No order submission or ExecutionReport leg belongs to this test.
This diagram explains the canonical actual-start test. It does not assert that a matching passing distribution is available for the current chart selection.
Captured sample FIX messages
One complete, correlated chain from the synthetic QuickFIX/C++ functional audit. These are actual captured bytes illustrating the current canonical wire shape, not messages from the older transport campaign or measured latency samples.
Request 262=1 asks for 264=10 levels and both bid/offer types. Its snapshot echoes the request ID and symbol; 268=20 counts twenty entries, not twenty levels. The complete wire example includes all ten bid/offer pairs in order.
| represents SOH (ASCII 0x01). Remove display line breaks and restore SOH to recover the exact message, including valid BodyLength (9) and CheckSum (10). FIX SendingTime (52) is a wall-clock field, not the monotonic measurement clock: do not subtract these timestamps to estimate latency. Tag 60 retains the fixed July fixture time.
Download the original synthetic wire capture → · Download all checked examples and source hashes →
What this test measures: Book → derived order → acknowledgementmd_nos_er · V → W → D → 8 · Client clock
Client clock: t1 − t0. Both timestamps belong to one endpoint; synchronized host clocks are not required.
- t0 · start
- Immediately before constructing and sending the market-data request, at actual task start.
- t1 · stop
- After parsing the final acknowledgement and completing the required report checks.
- Included
- Both request/reply legs, full-book parsing/checks, client-side order derivation from the received book, order construction/send and final acknowledgement processing. One interval covers the entire chain.
- Excluded
- Session establishment and warm-up. A prebuilt constant reaction order is not a valid substitute for deriving it from the parsed snapshot.
This diagram explains the canonical actual-start test. It does not assert that a matching passing distribution is available for the current chart selection.
Captured sample FIX messages
One complete, correlated chain from the synthetic QuickFIX/C++ functional audit. These are actual captured bytes illustrating the current canonical wire shape, not messages from the older transport campaign or measured latency samples.
The received marker 262=1 is odd, so the client derives a buy (54=1). It uses the parsed best ask 10001.00000 for 44 and the ask size 1000 for 38 (within the lot/cap bounds). Order 11=1 carries the same marker; the final acknowledgement echoes these derived values.
| represents SOH (ASCII 0x01). Remove display line breaks and restore SOH to recover the exact message, including valid BodyLength (9) and CheckSum (10). FIX SendingTime (52) is a wall-clock field, not the monotonic measurement clock: do not subtract these timestamps to estimate latency. Tag 60 retains the fixed July fixture time.
Download the original synthetic wire capture → · Download all checked examples and source hashes →
What this test measures: Completed tick → reaction-order arrivaltick_to_trade · W → D · Feed/server clock
Feed/server clock: t1 − t0. Both timestamps belong to one endpoint; synchronized host clocks are not required.
- t0 · start
- Immediately before sending the completed top-of-book tick. Constructing and finalising W happens before this timestamp.
- t1 · stop
- The first instruction of the feed-side application callback after the engine frames/parses the returning order, before benchmark-side marker/extraction checks.
- Included
- Tick send, both network legs, client tick parsing, decision and order derivation/construction/send, and feed-side engine delivery of the returning order.
- Excluded
- Tick construction and finalisation, then post-t1 marker matching and benchmark extraction checks. Those checks can still invalidate the result. There is no acknowledgement/fill leg.
This diagram explains the canonical actual-start test. It does not assert that a matching passing distribution is available for the current chart selection.
Captured sample FIX messages
One complete, correlated chain from the synthetic QuickFIX/C++ functional audit. These are actual captured bytes illustrating the current canonical wire shape, not messages from the older transport campaign or measured latency samples.
The tick is top-of-book only: 268=2, one bid and one offer. Marker 262=1 produces buy order 11=1 at the parsed ask 10001.00000 for quantity 1000. No 35=8 is sent in the headline tick-to-trade workflow.
| represents SOH (ASCII 0x01). Remove display line breaks and restore SOH to recover the exact message, including valid BodyLength (9) and CheckSum (10). FIX SendingTime (52) is a wall-clock field, not the monotonic measurement clock: do not subtract these timestamps to estimate latency. Tag 60 retains the fixed July fixture time.
Download the original synthetic wire capture → · Download all checked examples and source hashes →
Read the complete canonical scenario contract → · Codec operation diagrams and all nine microbenchmark tests →
Comparison by language
C++ and C
Latest codec CDF · HP · 18 October 2026
NewOrderSingle · checked parse and extract · rounded batch-average nanoseconds per operation, 32 operations per sample. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.
llfix receive results → Listed separately and unranked: they include SDK timestamp, sequence and callback work.
Full C++ and C codec table and all nine test selections →
Retained full-session CDF · 20 September 2026
Read selected workflow: order → acknowledgement →
| Rank | Engine | p50 (µs) | p99 (µs) | p99.9 (µs) | Evidence |
|---|---|---|---|---|---|
| 1 | LibHFT C++ | 13.577 | 17.935 | 23.523 | Recorded passing transport cell |
| — | quickfix_cpp | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
| — | nexusfix | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
| — | fix8 | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
| — | llfix | No matching admitted distribution | Retained campaign: blocked | ||
| — | hffix | No matching admitted distribution | Retained campaign: codec only | ||
| — | fixpp | No matching admitted distribution | Retained campaign: codec only | ||
| — | robaho_cpp_fix_codec | No matching admitted distribution | Retained campaign: codec only | ||
| — | openfix | No matching admitted distribution | Retained campaign: blocked | ||
| — | robaho_cpp_fix_engine | No matching admitted distribution | Retained campaign: blocked | ||
| — | libtrading | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
All targets and latest full-session notes
Current source-bound configuration notes accompany the retained campaign grades. A passing historical cell cannot fill a failed or retired current configuration.
| Engine | Full-session target | Retained campaign grade | Latest full-session note |
|---|---|---|---|
| libhft-cpp | required | S5 pass 4/4 | Current callback CORE/kernel/no-store comparison with NexusFIX passes all four flows on HP and SCAN after independent full replay (2026-10-14). Earlier before-parser tick comparisons remain separate; QuickFIX-family anchor, other flavours and public release remain open. |
| quickfix_cpp | required | S5 diag 4/4 | Complete canonical, bounded-preflight, threaded, checked-precision, integer-quantity, group-metadata and first-CPU physical configurations are retained separately. Both latest first-CPU campaigns and independent cold readers complete; every flow still misses the unchanged 10000/s report rate and exports zero cells (2026-10-19). Earlier non-parity rows remain historical; no unchanged timing retry is pending. |
| nexusfix | required | S5 diag 4/4 | Current original NexusFIX versus callback CORE comparison passes all four flows on both accepted DAC rigs with independent replay (2026-10-14). This closes the C++ minimum only; wider-roster and release gates remain open. |
| fix8 | required | S5 diag 4/4 | Original fixed-scale production Session, complete clocks/cadence/phases and immutable runtime qualify on both hosts. Both quiet DAC campaigns and independent full replay complete: HP passes all four flows; SCAN passes NOS/tick, MD misses rate and mixed misses rate/delay. Six distinct compact cells are admitted; no complete two-rig matched comparison is claimed (2026-10-24). |
| llfix | required | blocked | adapter ready; retained session, store/recovery and host evidence missing |
| hffix | n/a | codec only | See the retained campaign and current matched decisions. |
| fixpp | n/a | codec only | See the retained campaign and current matched decisions. |
| robaho_cpp_fix_codec | n/a | codec only | no tested session endpoint |
| openfix | excluded | blocked | no licence; Bazel-only; gnu++23 |
| robaho_cpp_fix_engine | excluded | blocked | upstream build fails; licence unknown |
| libtrading | required | S5 diag 4/4 | Separate canonical text-numeric configuration passes all four report flows on both accepted DAC rigs with exact independent replay and observed before/after host/NIC provenance. Eight compact cells retain source CDFs; website delivery uses summaries. The explicit 48-to-128 field capacity patch and older non-parity adapter remain separate (2026-10-19). C is reference-only, with no LibHFT C flavour or matched-language admission. |
Comparison by language
Java
Latest codec CDF · HP · 18 October 2026
NewOrderSingle · checked parse and extract · rounded batch-average nanoseconds per operation, 32 operations per sample. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.
Full Java codec table and all nine test selections →
Retained full-session CDF · 20 September 2026
Read selected workflow: order → acknowledgement →
| Rank | Engine | p50 (µs) | p99 (µs) | p99.9 (µs) | Evidence |
|---|---|---|---|---|---|
| 1 | LibHFT Java/JNI | 15.665 | 18.656 | 24.764 | Recorded passing transport cell |
| 2 | LibHFT Java Pure | 17.063 | 18.559 | 20.856 | Recorded passing transport cell |
| — | philadelphia | No matching admitted distribution | Retained campaign: S5 pass 4/4 | ||
| — | philadelphia-fast | No matching admitted distribution | Retained campaign: S5 pass 4/4 | ||
| — | crossfix | No matching admitted distribution | Retained campaign: S5 pass 4/4 | ||
| — | quickfixj | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
| — | artio | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
| — | falcon | No matching admitted distribution | Retained campaign: S3 smoke 1/4 | ||
All targets and latest full-session notes
Current source-bound configuration notes accompany the retained campaign grades. A passing historical cell cannot fill a failed or retired current configuration.
| Engine | Full-session target | Retained campaign grade | Latest full-session note |
|---|---|---|---|
| libhft-java-pure | required | S5 pass 4/4 | See the retained campaign and current matched decisions. |
| libhft-java-jni | required | S5 pass 4/4 | See the retained campaign and current matched decisions. |
| philadelphia | required | S5 pass 4/4 | See the retained campaign and current matched decisions. |
| philadelphia-fast | required | S5 pass 4/4 | Current complete callback comparison with the ASCII-numeric Java Pure baseline admits HP MD/tick only; no SCAN flow is admitted, so the Java two-rig minimum is blocked (2026-10-17). Both full physical collections and independent readers complete. Historical passing cells and superseded source comparisons never fill a current failed flow. |
| crossfix | conditional | S5 pass 4/4 | CrossFIX 1.6; 2.0 is not headline-grade; licensed installation only |
| quickfixj | required | S5 diag 4/4 | Original SDK canonical callback/complete-RTT default-GC configuration completes both sixteen-pair physical matrices and independent bounded collections. Every flow still fails rate and scheduler delay; SCAN NOS also fails percentile stability. Prior Epsilon, race and qualification failures remain separate; no unchanged timing retry is pending. QuickFIX-family anchor admission remains blocked (2026-10-17). |
| artio | required | S5 diag 4/4 | New original numeric codec and production Session qualify through clocks, bounded capture, cadence/backpressure, shared phases and installed DAC runtime on both hosts. Both full sixteen-pair quiet physical campaigns and independent full-value admissions complete; all flows retain rate/delay failures and zero cells are exported (2026-10-25). Original v10 diagnostics remain historical; no unchanged timing retry is pending. |
| falcon | n/a | S3 smoke 1/4 | no market-data messages, so N/A for the four flows |
Comparison by language
.NET
Latest codec CDF · HP · 18 October 2026
NewOrderSingle · checked parse and extract · rounded batch-average nanoseconds per operation, 32 operations per sample. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.
Full .NET codec table and all nine test selections →
Retained full-session CDF · 20 September 2026
Read selected workflow: order → acknowledgement →
| Rank | Engine | p50 (µs) | p99 (µs) | p99.9 (µs) | Evidence |
|---|---|---|---|---|---|
| 1 | LibHFT .NET Native | 15.481 | 16.537 | 19.042 | Recorded passing transport cell |
| 2 | LibHFT .NET Pure | 20.794 | 24.811 | 28.828 | Recorded passing transport cell |
| — | quickfix_n | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
| — | fixantenna_net | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
All targets and latest full-session notes
Current source-bound configuration notes accompany the retained campaign grades. A passing historical cell cannot fill a failed or retired current configuration.
| Engine | Full-session target | Retained campaign grade | Latest full-session note |
|---|---|---|---|
| libhft-dotnet-managed | required | S5 pass 4/4 | Actual public managed .NET 10 first-CPU complete-RTT/callback baseline passes all four flows on both accepted DAC rigs with independent full replay (2026-10-17). The matched QuickFIX/n comparison remains blocked by peer timing. Earlier .NET 8 and inherited-placement configurations keep their own source/clock identities and grades. |
| libhft-dotnet-native | required | S5 pass 4/4 | Actual public Native handler/complete-RTT first-CPU configuration passes all four flows on both accepted DAC rigs after the qualified single-traversal book extraction and independent full replay (2026-10-17). Inherited-placement, historical receive-clock and earlier mixed/tick failures remain separate. No .NET peer comparison is inferred from Native results. |
| quickfix_n | required | S5 diag 4/4 | Original public SDK .NET 10 parsing-metadata/complete-request first-CPU configuration completes both quiet physical campaigns and independent full replay. HP NOS/tick pass; HP MD/mixed and every SCAN flow fail rate, with other delay/stability blockers retained. The independent two-rig .NET comparison is blocked and failed flows have no ratios (2026-10-17). Validated/inherited and historical non-parity configurations remain separate. |
| fixantenna_net | admission | S5 diag 4/4 | Original numeric writer, production Session, exact clocks/shared phases, report preflight and immutable DAC deployments qualify independently on both hosts. Both original report and separate receiver-placement full physical campaigns complete with independent replay; all flows fail rate/delay and write zero cells (2026-10-26). Tick retains an SDK-envelope prepared-application boundary blocker; original SDK/harness stay unchanged. No unchanged campaign rerun or .NET admission is pending. |
Comparison by language
Rust
Latest codec CDF · HP · 18 October 2026
NewOrderSingle · checked parse and extract · rounded batch-average nanoseconds per operation, 32 operations per sample. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.
Full Rust codec table and all nine test selections →
Retained full-session CDF · 20 September 2026
Read selected workflow: order → acknowledgement →
| Rank | Engine | p50 (µs) | p99 (µs) | p99.9 (µs) | Evidence |
|---|---|---|---|---|---|
| 1 | LibHFT Rust | 14.504 | 15.876 | 18.233 | Recorded passing transport cell |
| — | libhft-rust-native | No matching admitted distribution | Retained campaign: parked | ||
| — | dfx | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
| — | fixer_rs | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
| — | truefix | No matching admitted distribution | Retained campaign: S4 diag 4/4 | ||
| — | nanofix | No matching admitted distribution | Retained campaign: S5 pass 4/4 | ||
| — | ferrumfix | No matching admitted distribution | Retained campaign: codec only | ||
All targets and latest full-session notes
Current source-bound configuration notes accompany the retained campaign grades. A passing historical cell cannot fill a failed or retired current configuration.
| Engine | Full-session target | Retained campaign grade | Latest full-session note |
|---|---|---|---|
| libhft-rust-pure | required | S5 pass 4/4 | Corrected complete-RTT/callback first-CPU Rust open versus NanoFIX comparison passes all four flows on HP and SCAN with independently replayed physical evidence (2026-10-17). Earlier shortened-clock canonical comparisons are retired; inherited-placement failures, TrueFix, other flavours and release remain separate. |
| libhft-rust-native | parked | parked | parked 2026-09-11 |
| dfx | required | S5 diag 4/4 | Both original pinned SDK writer/parser investigations preserve all values and group associations but expose canonical outer-field-order failures in every flow. Explicit body-only order controls pass; the production Session uses the default writer. A supported canonical production writer remains blocked before fresh Session/clock/DAC admission (2026-10-19); legacy non-parity diagnostics remain historical. |
| fixer_rs | required | S5 diag 4/4 | Separate public custom-order SDK configuration qualifies through real Session, prepared/callback clocks and timed phases on both hosts. Both complete quiet DAC matrices and independent full replay finish: HP NOS/tick pass; HP MD/mixed and all SCAN flows retain report blockers. Two new compact cells are admitted; no unchanged timing retry is pending. A complete matched comparison remains blocked (2026-10-23). |
| truefix | admission | S4 diag 4/4 | Corrected callback/complete-RTT current-thread production Session completes both full physical matrices and independent cold readers (2026-10-17). Five current compact cells pass: HP NOS/MD/tick and SCAN NOS/tick. HP mixed and SCAN MD/mixed retain report timing failures. Original shortened-clock results remain retired; a compatible separately qualified first-CPU/configuration and fresh matched two-rig comparison remain open. |
| nanofix | admission | S5 pass 4/4 | Corrected complete-RTT/callback first-CPU original public-transport NanoFIX versus Rust open comparison passes all four flows on both accepted DAC rigs with independent matched replay (2026-10-17). Older shortened-clock results remain retired and do not supply current admission; the explicit Aeron compatibility patch remains declared. |
| ferrumfix | n/a | codec only | See the retained campaign and current matched decisions. |
Comparison by language
Go
Latest codec CDF · HP · 18 October 2026
NewOrderSingle · checked parse and extract · rounded batch-average nanoseconds per operation, 32 operations per sample. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.
Full Go codec table and all nine test selections →
Retained full-session CDF · 20 September 2026
Read selected workflow: order → acknowledgement →
No matching admitted full-session distribution. The source roster remains visible below; no curve or latency is invented.
| Rank | Engine | p50 (µs) | p99 (µs) | p99.9 (µs) | Evidence |
|---|---|---|---|---|---|
| — | quickfix_go | No matching admitted distribution | Retained campaign: S5 diag 4/4 | ||
All targets and latest full-session notes
Current source-bound configuration notes accompany the retained campaign grades. A passing historical cell cannot fill a failed or retired current configuration.
| Engine | Full-session target | Retained campaign grade | Latest full-session note |
|---|---|---|---|
| quickfix_go | required | S5 diag 4/4 | Original public writer/parser capability completes on both hosts at the retained microbench SDK pin, with all values and group associations intact. All 240 frames per host differ in canonical outer order because the public field map sorts tags; fresh Session/clock/DAC admission is blocked on a supported writer path (2026-10-19). Go remains reference-only, with no LibHFT Go flavour. |
Read the current test evidence.
Correctness gates, wire captures, ownership checks, prepared clocks and scheduler-delay tests from 2–3 October are retained in the archive. Functional passes are not latency distributions; overloaded, incomplete and non-parity attempts stay out of these curves.