AtrekesLibHFTDocumentationEngine comparison

Full-session and codec evidence

Same language. Same workload. A visible contract.

Every language has its own competition list and CDF. Curves show the five fastest qualifying engines by p50, or the available subset when fewer than five have matching evidence. Failed targets are never turned into fast latency rows.

Evidence refreshed: 2026-10-03Top-five CDF · full roster tableFive language groups

Latest codec comparison

25 adapters. Checked numeric field work.

The corrected 3 October microbenchmark campaign passes 25 normal runs and 320 isolated text/numeric probes. C++, Java and Rust each have five-engine CDFs; .NET has four measured peers and Go one. llfix has encoder results only, not receive-parser or full-session results.

Retained transport reference

A passing reference is not a new competitor campaign.

The charts below use retained open-loop v4 results dated 20 September 2026. Newer tests refresh the admission roster, but do not yet supply a 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.

Read selected workflow: order → acknowledgement →

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.

Scheduled order-response latency
Published open-loop reference. t0 is the intended send slot; scheduler delay is included. t1 follows reply parsing and required checks. Open diagram ↗
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.

Order round trip · nos_er
Client clock: t0 before order construction/send, D to the server, derived ACK 8 back, t1 after client parsing and required extraction/checks. Open diagram ↗

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.

1. CLIENT → SERVER · NewOrderSingle 35=D

8=FIX.4.4|9=132|35=D|34=2|49=CLIENT|52=20261003-00:42:20.433|56=SERVER|
11=1|21=1|38=1000|40=2|44=10000.00000|54=1|55=LCOM1|60=20260703-12:00:00.000|
10=201|

2. SERVER → CLIENT · ExecutionReport · New acknowledgement 35=8

8=FIX.4.4|9=182|35=8|34=2|49=SERVER|52=20261003-00:42:20.433|56=CLIENT|
6=0.00000|11=1|14=0|17=TCP-EXEC|37=TCP-ORDER|38=1000|39=0|44=10000.00000|54=1|55=LCOM1|60=20260703-12:00:00.000|150=0|151=1000|
10=060|

| 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.

Market-data round trip · md
Client clock: t0 before market-data request construction/send, V requests 10 levels, W returns 20 bid/offer entries, t1 after snapshot parsing and required checks. No order is sent. Open diagram ↗
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.

1. CLIENT → SERVER · MarketDataRequest 35=V

8=FIX.4.4|9=113|35=V|34=2|49=CLIENT|52=20261003-00:42:26.939|56=SERVER|
146=1|55=LCOM1|262=1|263=0|264=10|265=0|267=2|269=0|269=1|
10=083|

2. SERVER → CLIENT · MarketDataSnapshotFullRefresh 35=W

8=FIX.4.4|9=688|35=W|34=2|49=SERVER|52=20261003-00:42:26.939|56=CLIENT|
55=LCOM1|262=1|268=20|
269=0|270=10000.00000|271=1000|269=1|270=10001.00000|271=1000|
269=0|270=9999.99000|271=1010|269=1|270=10001.01000|271=1010|
269=0|270=9999.98000|271=1020|269=1|270=10001.02000|271=1020|
269=0|270=9999.97000|271=1030|269=1|270=10001.03000|271=1030|
269=0|270=9999.96000|271=1040|269=1|270=10001.04000|271=1040|
269=0|270=9999.95000|271=1050|269=1|270=10001.05000|271=1050|
269=0|270=9999.94000|271=1060|269=1|270=10001.06000|271=1060|
269=0|270=9999.93000|271=1070|269=1|270=10001.07000|271=1070|
269=0|270=9999.92000|271=1080|269=1|270=10001.08000|271=1080|
269=0|270=9999.91000|271=1090|269=1|270=10001.09000|271=1090|
10=218|

| 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.

Market data to order · md_nos_er
Client clock: V request, ten-level W snapshot, client derives D from parsed book values, server returns ACK 8, t1 after report parsing and required checks. Two request/reply legs plus client derivation, not a single round trip. Open diagram ↗
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.

1. CLIENT → SERVER · MarketDataRequest 35=V

8=FIX.4.4|9=113|35=V|34=2|49=CLIENT|52=20261003-00:42:35.638|56=SERVER|
146=1|55=LCOM1|262=1|263=0|264=10|265=0|267=2|269=0|269=1|
10=079|

2. SERVER → CLIENT · MarketDataSnapshotFullRefresh 35=W

8=FIX.4.4|9=688|35=W|34=2|49=SERVER|52=20261003-00:42:35.638|56=CLIENT|
55=LCOM1|262=1|268=20|
269=0|270=10000.00000|271=1000|269=1|270=10001.00000|271=1000|
269=0|270=9999.99000|271=1010|269=1|270=10001.01000|271=1010|
269=0|270=9999.98000|271=1020|269=1|270=10001.02000|271=1020|
269=0|270=9999.97000|271=1030|269=1|270=10001.03000|271=1030|
269=0|270=9999.96000|271=1040|269=1|270=10001.04000|271=1040|
269=0|270=9999.95000|271=1050|269=1|270=10001.05000|271=1050|
269=0|270=9999.94000|271=1060|269=1|270=10001.06000|271=1060|
269=0|270=9999.93000|271=1070|269=1|270=10001.07000|271=1070|
269=0|270=9999.92000|271=1080|269=1|270=10001.08000|271=1080|
269=0|270=9999.91000|271=1090|269=1|270=10001.09000|271=1090|
10=214|

3. CLIENT → SERVER · NewOrderSingle 35=D

8=FIX.4.4|9=132|35=D|34=3|49=CLIENT|52=20261003-00:42:35.638|56=SERVER|
11=1|21=1|38=1000|40=2|44=10001.00000|54=1|55=LCOM1|60=20260703-12:00:00.000|
10=216|

4. SERVER → CLIENT · ExecutionReport · New acknowledgement 35=8

8=FIX.4.4|9=182|35=8|34=3|49=SERVER|52=20261003-00:42:35.638|56=CLIENT|
6=0.00000|11=1|14=0|17=TCP-EXEC|37=TCP-ORDER|38=1000|39=0|44=10001.00000|54=1|55=LCOM1|60=20260703-12:00:00.000|150=0|151=1000|
10=075|

| 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.

Tick to trade · tick_to_trade
Same feed clock: build the top-of-book tick outside timing; t0 immediately before sending completed W with two entries; client parses and derives D; t1 at feed-side engine delivery of D before benchmark extraction/marker checks. No ExecutionReport leg. Open diagram ↗
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.

1. SERVER → CLIENT · MarketDataSnapshotFullRefresh 35=W

8=FIX.4.4|9=138|35=W|34=2|49=SERVER|52=20261003-00:42:39.983|56=CLIENT|
55=LCOM1|262=1|268=2|
269=0|270=10000.00000|271=1000|269=1|270=10001.00000|271=1000|
10=005|

2. CLIENT → SERVER · NewOrderSingle 35=D

8=FIX.4.4|9=132|35=D|34=2|49=CLIENT|52=20261003-00:42:39.984|56=SERVER|
11=1|21=1|38=1000|40=2|44=10001.00000|54=1|55=LCOM1|60=20260703-12:00:00.000|
10=223|

| 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 · 3 October 2026

NewOrderSingle · checked parse and extract · nanoseconds/operation · 32-operation batch averages. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.

LibHFT C++hffixNexusFIXFixpplibtrading
Reconstructed CDF of the fastest 5 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗

Full C++ and C codec table and all nine test selections →

Retained full-session CDF · 20 September 2026

Read selected workflow: order → acknowledgement →

LibHFT C++
Reconstructed CDF of the fastest 1 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗
RankEnginep50 (µs)p99 (µs)p99.9 (µs)Evidence
1LibHFT C++13.57717.93523.523Recorded passing transport cell
—quickfix_cppNo matching admitted distributionS5 diag 4/4
—nexusfixNo matching admitted distributionS5 diag 4/4
—fix8No matching admitted distributionS5 diag 4/4
—llfixNo matching admitted distributionblocked
—hffixNo matching admitted distributioncodec only
—fixppNo matching admitted distributioncodec only
—robaho_cpp_fix_codecNo matching admitted distributioncodec only
—openfixNo matching admitted distributionblocked
—robaho_cpp_fix_engineNo matching admitted distributionblocked
—libtradingNo matching admitted distributionS5 diag 4/4

Comparison by language

Java

Latest codec CDF · 3 October 2026

NewOrderSingle · checked parse and extract · nanoseconds/operation · 32-operation batch averages. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.

LibHFT Java PureLibHFT Java/JNIFalconPhiladelphiaQuickFIX/J
Reconstructed CDF of the fastest 5 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗

Full Java codec table and all nine test selections →

Retained full-session CDF · 20 September 2026

Read selected workflow: order → acknowledgement →

LibHFT Java/JNILibHFT Java Pure
Reconstructed CDF of the fastest 2 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗
RankEnginep50 (µs)p99 (µs)p99.9 (µs)Evidence
1LibHFT Java/JNI15.66518.65624.764Recorded passing transport cell
2LibHFT Java Pure17.06318.55920.856Recorded passing transport cell
—philadelphiaNo matching admitted distributionS5 pass 4/4
—philadelphia-fastNo matching admitted distributionS5 pass 4/4
—crossfixNo matching admitted distributionS5 pass 4/4
—quickfixjNo matching admitted distributionS5 diag 4/4
—artioNo matching admitted distributionS5 diag 4/4
—falconNo matching admitted distributionS3 smoke 1/4

Comparison by language

.NET

Latest codec CDF · 3 October 2026

NewOrderSingle · checked parse and extract · nanoseconds/operation · 32-operation batch averages. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.

LibHFT .NET NativeLibHFT .NET PureFIX Antenna .NET CoreQuickFIX/n
Reconstructed CDF of the fastest 4 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗

Full .NET codec table and all nine test selections →

Retained full-session CDF · 20 September 2026

Read selected workflow: order → acknowledgement →

LibHFT .NET NativeLibHFT .NET Pure
Reconstructed CDF of the fastest 2 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗
RankEnginep50 (µs)p99 (µs)p99.9 (µs)Evidence
1LibHFT .NET Native15.48116.53719.042Recorded passing transport cell
2LibHFT .NET Pure20.79424.81128.828Recorded passing transport cell
—quickfix_nNo matching admitted distributionS5 diag 4/4
—fixantenna_netNo matching admitted distributionS5 diag 4/4

Comparison by language

Rust

Latest codec CDF · 3 October 2026

NewOrderSingle · checked parse and extract · nanoseconds/operation · 32-operation batch averages. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.

LibHFT RustNanoFIXTrueFixDFXfixer-rs
Reconstructed CDF of the fastest 5 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗

Full Rust codec table and all nine test selections →

Retained full-session CDF · 20 September 2026

Read selected workflow: order → acknowledgement →

LibHFT Rust
Reconstructed CDF of the fastest 1 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗
RankEnginep50 (µs)p99 (µs)p99.9 (µs)Evidence
1LibHFT Rust14.50415.87618.233Recorded passing transport cell
—libhft-rust-nativeNo matching admitted distributionparked
—dfxNo matching admitted distributionS5 diag 4/4
—fixer_rsNo matching admitted distributionS5 diag 4/4
—truefixNo matching admitted distributionS4 diag 4/4
—nanofixNo matching admitted distributionS4 diag 4/4
—ferrumfixNo matching admitted distributioncodec only

Comparison by language

Go

Latest codec CDF · 3 October 2026

NewOrderSingle · checked parse and extract · nanoseconds/operation · 32-operation batch averages. This fixed codec chart does not change with the full-session selectors. It excludes networking and session state.

QuickFIX/Go
Reconstructed CDF of the fastest 1 qualifying engines by p50
Percentile-anchor reconstruction, not a raw-sample empirical CDF. Up to five engines with matching evidence; the table retains the full roster. Open CDF ↗

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.

RankEnginep50 (µs)p99 (µs)p99.9 (µs)Evidence
—quickfix_goNo matching admitted distributionS5 diag 4/4

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.

Download this page’s measured snapshot and source hashes.