Explore the results
One message. Every operation.
Choose a FIX message and compare encoding, checked parsing and parsing + extraction together for every language. Each table is ranked by measured p50 within its language and operation.
Campaign: HP · Intel Xeon Gold 6254 · Linux 5.14.0-687.44.1.el9_8.x86_64 · measurement CPUs 16–17; launcher CPUs 0–7 · 18 October 2026 · measured LibHFT source 5917330b7c2c. Peer versions and pinned inputs are listed under method and evidence.
NewOrderSingle · 25 measured adapters · 73 operation results. Lower is better.
Compare p50 and p99 at a glance. Expand CDF & all percentiles for the top-five-engine chart and the full ranked table. Missing results are labelled, never plotted as zero.
See the NewOrderSingle message and all three tests →
Percentiles are rounded batch-average nanoseconds per operation: each of the 50,000 samples averages 32 in-process operations, so they are not individual-call or network latencies. CDFs connect measured percentile anchors; they are reconstructed profiles, not raw-sample empirical CDFs. What each test measures →
Same-host codec comparison
C++ and C
Native FIX engines and codec libraries, including LibHFT C++, QuickFIX/C++, NexusFIX, Fix8, hffix, Fixpp, llfix and libtrading. llfix encoding is ranked here; its receive cells include SDK timestamp, sequence and callback work and are listed separately.
Encoding
Field values → FIX bytes
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT C++ | 49 | 50 |
| hffix | 127 | 132 |
| llfix | 321 | 328 |
| NexusFIX | 363 | 380 |
| libtrading | 445 | 457 |
| QuickFIX/C++ | 2,614 | 2,624 |
| Fix8 | 3,065 | 3,088 |
| Fixpp | 3,088 | 3,145 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT C++ | 49 | 50 | 50 | 51 |
| 2 | hffix | 127 | 130 | 132 | 133 |
| 3 | llfix | 321 | 324 | 328 | 330 |
| 4 | NexusFIX | 363 | 371 | 380 | 388 |
| 5 | libtrading | 445 | 451 | 457 | 461 |
| 6 | QuickFIX/C++ | 2,614 | 2,620 | 2,624 | 2,627 |
| 7 | Fix8 | 3,065 | 3,076 | 3,088 | 3,097 |
| 8 | Fixpp | 3,088 | 3,110 | 3,145 | 3,172 |
Checked parsing
FIX bytes → checked field values
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT C++ | 356 | 358 |
| hffix | 389 | 397 |
| NexusFIX | 849 | 856 |
| Fixpp | 919 | 922 |
| libtrading | 1,479 | 1,484 |
| QuickFIX/C++ | 2,095 | 2,103 |
| Fix8 | 5,519 | 5,538 |
| llfix | Receive includes SDK timestamp, sequence and callback work · listed separately, unranked | |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT C++ | 356 | 358 | 358 | 359 |
| 2 | hffix | 389 | 394 | 397 | 397 |
| 3 | NexusFIX | 849 | 854 | 856 | 858 |
| 4 | Fixpp | 919 | 920 | 922 | 924 |
| 5 | libtrading | 1,479 | 1,482 | 1,484 | 1,486 |
| 6 | QuickFIX/C++ | 2,095 | 2,099 | 2,103 | 2,105 |
| 7 | Fix8 | 5,519 | 5,530 | 5,538 | 5,546 |
| — | llfix | Receive includes SDK timestamp, sequence and callback work · listed separately, unranked | |||
Parsing + extraction
FIX bytes → extracted business fields
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT C++ | 356 | 358 |
| hffix | 387 | 395 |
| NexusFIX | 852 | 861 |
| Fixpp | 918 | 921 |
| libtrading | 1,479 | 1,484 |
| QuickFIX/C++ | 2,093 | 2,100 |
| Fix8 | 5,511 | 5,529 |
| llfix | Receive includes SDK timestamp, sequence and callback work · listed separately, unranked | |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT C++ | 356 | 357 | 358 | 359 |
| 2 | hffix | 387 | 392 | 395 | 397 |
| 3 | NexusFIX | 852 | 857 | 861 | 863 |
| 4 | Fixpp | 918 | 920 | 921 | 923 |
| 5 | libtrading | 1,479 | 1,482 | 1,484 | 1,486 |
| 6 | QuickFIX/C++ | 2,093 | 2,097 | 2,100 | 2,102 |
| 7 | Fix8 | 5,511 | 5,521 | 5,529 | 5,536 |
| — | llfix | Receive includes SDK timestamp, sequence and callback work · listed separately, unranked | |||
Same-host codec comparison
Java
Java Pure and Java/JNI beside QuickFIX/J, Philadelphia, Artio and Falcon. JNI timing includes one native codec call per message.
Encoding
Field values → FIX bytes
| Engine / codec | p50 | p99 |
|---|---|---|
| Philadelphia | 308 | 1,564 |
| LibHFT Java Pure | 347 | 627 |
| LibHFT Java/JNI | 392 | 1,014 |
| Falcon | 887 | 1,199 |
| Artio | 1,169 | 2,269 |
| QuickFIX/J | 1,346 | 5,008 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | Philadelphia | 308 | 311 | 1,564 | 1,741 |
| 2 | LibHFT Java Pure | 347 | 535 | 627 | 2,625 |
| 3 | LibHFT Java/JNI | 392 | 497 | 1,014 | 1,201 |
| 4 | Falcon | 887 | 920 | 1,199 | 4,965 |
| 5 | Artio | 1,169 | 1,272 | 2,269 | 23,957 |
| 6 | QuickFIX/J | 1,346 | 1,375 | 5,008 | 5,656 |
Checked parsing
FIX bytes → checked field values
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT Java Pure | 585 | 1,179 |
| LibHFT Java/JNI | 710 | 1,353 |
| Falcon | 743 | 2,766 |
| Philadelphia | 979 | 2,104 |
| QuickFIX/J | 1,629 | 4,265 |
| Artio | 1,995 | 3,869 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT Java Pure | 585 | 587 | 1,179 | 1,259 |
| 2 | LibHFT Java/JNI | 710 | 715 | 1,353 | 1,410 |
| 3 | Falcon | 743 | 747 | 2,766 | 4,904 |
| 4 | Philadelphia | 979 | 985 | 2,104 | 5,239 |
| 5 | QuickFIX/J | 1,629 | 1,663 | 4,265 | 7,834 |
| 6 | Artio | 1,995 | 2,536 | 3,869 | 384,320 |
Parsing + extraction
FIX bytes → extracted business fields
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT Java Pure | 583 | 593 |
| LibHFT Java/JNI | 710 | 722 |
| Falcon | 743 | 767 |
| Philadelphia | 981 | 1,025 |
| QuickFIX/J | 1,630 | 1,722 |
| Artio | 1,996 | 2,081 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT Java Pure | 583 | 585 | 593 | 649 |
| 2 | LibHFT Java/JNI | 710 | 713 | 722 | 781 |
| 3 | Falcon | 743 | 746 | 767 | 914 |
| 4 | Philadelphia | 981 | 986 | 1,025 | 1,240 |
| 5 | QuickFIX/J | 1,630 | 1,639 | 1,722 | 1,998 |
| 6 | Artio | 1,996 | 2,010 | 2,081 | 2,410 |
Same-host codec comparison
.NET
.NET Pure and .NET Native beside QuickFIX/n and the public FIX Antenna .NET Core codec. The native flavor includes its interop boundary.
Encoding
Field values → FIX bytes
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT .NET Pure | 191 | 985 |
| LibHFT .NET Native | 265 | 539 |
| FIX Antenna .NET Core | 2,583 | 10,503 |
| QuickFIX/n | 4,782 | 18,952 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT .NET Pure | 191 | 962 | 985 | 1,011 |
| 2 | LibHFT .NET Native | 265 | 526 | 539 | 549 |
| 3 | FIX Antenna .NET Core | 2,583 | 2,631 | 10,503 | 14,034 |
| 4 | QuickFIX/n | 4,782 | 4,811 | 18,952 | 22,481 |
Checked parsing
FIX bytes → checked field values
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT .NET Native | 501 | 1,812 |
| LibHFT .NET Pure | 1,004 | 2,662 |
| FIX Antenna .NET Core | 1,651 | 3,161 |
| QuickFIX/n | 4,987 | 7,334 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT .NET Native | 501 | 503 | 1,812 | 1,932 |
| 2 | LibHFT .NET Pure | 1,004 | 1,007 | 2,662 | 2,864 |
| 3 | FIX Antenna .NET Core | 1,651 | 1,670 | 3,161 | 4,416 |
| 4 | QuickFIX/n | 4,987 | 5,023 | 7,334 | 7,756 |
Parsing + extraction
FIX bytes → extracted business fields
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT .NET Native | 484 | 486 |
| LibHFT .NET Pure | 1,021 | 1,029 |
| FIX Antenna .NET Core | 1,648 | 1,690 |
| QuickFIX/n | 4,981 | 7,291 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT .NET Native | 484 | 485 | 486 | 487 |
| 2 | LibHFT .NET Pure | 1,021 | 1,025 | 1,029 | 1,035 |
| 3 | FIX Antenna .NET Core | 1,648 | 1,665 | 1,690 | 4,264 |
| 4 | QuickFIX/n | 4,981 | 5,015 | 7,291 | 7,676 |
Same-host codec comparison
Rust
LibHFT Rust, FerrumFIX, DFX, fixer-rs, TrueFix and NanoFIX under the same message fixtures and measured operations.
Encoding
Field values → FIX bytes
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT Rust | 144 | 145 |
| NanoFIX | 168 | 171 |
| FerrumFIX | 1,271 | 1,311 |
| TrueFix | 1,634 | 1,648 |
| fixer-rs | 3,811 | 3,826 |
| DFX | 5,815 | 5,862 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT Rust | 144 | 144 | 145 | 146 |
| 2 | NanoFIX | 168 | 170 | 171 | 172 |
| 3 | FerrumFIX | 1,271 | 1,290 | 1,311 | 1,321 |
| 4 | TrueFix | 1,634 | 1,644 | 1,648 | 1,651 |
| 5 | fixer-rs | 3,811 | 3,819 | 3,826 | 3,839 |
| 6 | DFX | 5,815 | 5,840 | 5,862 | 6,009 |
Checked parsing
FIX bytes → checked field values
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT Rust | 527 | 539 |
| NanoFIX | 1,248 | 1,256 |
| TrueFix | 2,036 | 2,042 |
| DFX | 2,538 | 2,547 |
| fixer-rs | 4,674 | 4,686 |
| FerrumFIX | 7,422 | 7,450 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT Rust | 527 | 533 | 539 | 544 |
| 2 | NanoFIX | 1,248 | 1,252 | 1,256 | 1,260 |
| 3 | TrueFix | 2,036 | 2,039 | 2,042 | 2,044 |
| 4 | DFX | 2,538 | 2,544 | 2,547 | 2,549 |
| 5 | fixer-rs | 4,674 | 4,680 | 4,686 | 4,689 |
| 6 | FerrumFIX | 7,422 | 7,438 | 7,450 | 7,461 |
Parsing + extraction
FIX bytes → extracted business fields
| Engine / codec | p50 | p99 |
|---|---|---|
| LibHFT Rust | 528 | 544 |
| NanoFIX | 1,230 | 1,248 |
| TrueFix | 2,036 | 2,043 |
| DFX | 2,656 | 2,674 |
| fixer-rs | 4,611 | 4,624 |
| FerrumFIX | 7,425 | 7,460 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | LibHFT Rust | 528 | 537 | 544 | 550 |
| 2 | NanoFIX | 1,230 | 1,239 | 1,248 | 1,256 |
| 3 | TrueFix | 2,036 | 2,040 | 2,043 | 2,045 |
| 4 | DFX | 2,656 | 2,668 | 2,674 | 2,678 |
| 5 | fixer-rs | 4,611 | 4,619 | 4,624 | 4,627 |
| 6 | FerrumFIX | 7,425 | 7,443 | 7,460 | 7,470 |
Same-host codec comparison
Go
QuickFIX/Go is retained in the wider codec roster. There is no LibHFT Go flavor and no same-language competitor ranking to infer from this single row.
Encoding
Field values → FIX bytes
| Engine / codec | p50 | p99 |
|---|---|---|
| QuickFIX/Go | 8,128 | 182,531 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | QuickFIX/Go | 8,128 | 13,063 | 182,531 | 498,344 |
Checked parsing
FIX bytes → checked field values
| Engine / codec | p50 | p99 |
|---|---|---|
| QuickFIX/Go | 2,405 | 4,637 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | QuickFIX/Go | 2,405 | 4,436 | 4,637 | 84,929 |
Parsing + extraction
FIX bytes → extracted business fields
| Engine / codec | p50 | p99 |
|---|---|---|
| QuickFIX/Go | 2,401 | 4,650 |
CDF & all percentiles
| Rank | Engine / codec | p50 (ns) | p90 (ns) | p99 (ns) | p99.9 (ns) |
|---|---|---|---|---|---|
| 1 | QuickFIX/Go | 2,401 | 4,436 | 4,650 | 59,625 |
Listed separately · C++
llfix receive results, unranked.
The llfix 1.0.8 receive path is measured through the upstream LLFIX_BENCHMARK hook, without SDK patches or a substitute parser. That hook enters FixClient::process_rx_buffer, which reads the monotonic clock, updates the sequence store and dispatches the callback for every message. Those costs are inside each sample, so these six cells stay outside the codec rankings. SDK receive validations and serialization are disabled for this lane. Its three encoder cells, which include the SDK-generated SendingTime, are ranked in the C++ tables above.
Swipe the table horizontally for all percentiles.
| Message · operation | p50 | p90 | p99 | p99.9 |
|---|---|---|---|---|
| NewOrderSingle · Checked parsing | 1,469 | 1,477 | 1,481 | 1,485 |
| NewOrderSingle · Parsing + extraction | 1,474 | 1,485 | 1,489 | 1,495 |
| ExecutionReport · Checked parsing | 1,741 | 1,747 | 1,753 | 1,758 |
| ExecutionReport · Parsing + extraction | 1,756 | 1,761 | 1,766 | 1,769 |
| MarketDataSnapshot · depth 10 · Checked parsing | 4,957 | 4,964 | 4,968 | 4,972 |
| MarketDataSnapshot · depth 10 · Parsing + extraction | 9,034 | 9,103 | 9,131 | 9,154 |
An earlier single-engine llfix run on SCAN (3 October 2026, source 211372a6) remains historical evidence with its own summary CSV, field probes, host qualification, source and checksum receipt, measurement clock, CPU configuration and snapshot. It is not merged with this campaign.
What the test measures
Three operations. Shared messages.
Encoding
Start with field values, populate a message and serialize it through the public builder. Framing and checksum work are included only where that adapter’s build path performs them.
Checked parsing
Parse and check the complete business-field set for D/8. For W, check symbol, entry count and best bid/offer. Numeric conversion and the typed value hash are inside timing.
Parsing + extraction
Parse, read the specified business fields and fold them into a checked sink. Depth-10 market data includes all 20 ordered bid/offer entries.
Fixtures are NewOrderSingle (35=D), ExecutionReport (35=8) and a 10-level MarketDataSnapshot (35=W). The same pinned fixtures and sample counts are used throughout.
See the actual FIX messages and a worked explanation of all nine tests →
The ranked cells exclude networking, Logon, sequence recovery, storage and application callbacks. llfix’s receive cells include its SDK callback and are listed separately, unranked. There is no offered messages-per-second target in this in-process test, and the inverse of a codec timing is not sustained session capacity. Use the full-engine comparison for that question.
From bytes to measured work
What happens in each test?
The corrected converted-values-v2 contract requires complete checked field work for both D/8 parse labels. They intentionally perform the same operation; neither is a framing-only shortcut. W distinguishes top-of-book checks from full-book extraction. Build starts from values, not by parsing or echoing the input message.
Swipe diagrams sideways on a small screen, or open a diagram to zoom.
Checked parse: receive bytes, verify the required fields.
Parse and extract: the reads are inside the sample.
Build: start from values, not a received message.
In the examples, | represents the real FIX separator SOH (ASCII 0x01). Line breaks are for readability only. Restore SOH and remove those line breaks to recover the pinned input bytes; BodyLength (9) and CheckSum (10) are calculated for those bytes.
Tags 9001 and 9002 are benchmark-specific field-work hashes, not standard FIX fields or cryptographic signatures. The oracle uses type-marked converted values: unsigned integers, scale-five fixed-point prices and ASCII strings, each followed by byte 1. The fixed July timestamps belong to the fixtures, not the October measurement date. Download the pinned examples and their source hashes.
NewOrderSingle · 35=D
A day limit order to buy 100,000 AUD/NZD at 1.08245. 11 is the client order ID, 55 the symbol, 54=1 buy, 38 quantity, 40=2 limit, 44 price and 59=0 day time-in-force.
Pinned input for both parsing tests
- 1. Checked parse
parse_only - Feed the complete order into the public parser and read all nine fields:
11, 21, 55, 54, 60, 38, 40, 44, 59. Convert numeric values, fold typed values into FNV-1a and compare with9002=2863910631. No order is submitted and no session state changes. - 2. Parse and extract
parse_extract - Perform the same complete checked operation as D
parse_only. Both names remain for table compatibility, not as different amounts of field work. Text and numeric mutations independently verify each operation's reads. - 3. Build
build_D - Populate an order with the business values above through the public builder, serialize its fields and consume the output length. Sequence numbers or generated client order IDs may change between iterations. This measures constructing an order, not transmitting it or obtaining an execution.
Sample build payload · header and framing omitted
An illustrative payload assembled from the fixture’s business values, not a captured byte-for-byte result from every builder.
ExecutionReport · 35=8
An acknowledgement that the order is new, with all 100,000 units still open: 150=0 is a new execution event, 39=0 new order status, 151=100000 remaining quantity, 14=0 filled quantity and 6=0.00000 average fill price. This is not a fill report.
Pinned input for both parsing tests
- 1. Checked parse
parse_only - Parse and perform the same complete twelve-field checked operation described below. It does not update an order book or position.
- 2. Parse and extract
parse_extract - Parse, read and hash twelve values: order ID (
37), execution ID (17), client order ID (11), execution type (150), order status (39), symbol (55), side (54), order quantity (38), remaining quantity (151), filled quantity (14), average price (6) and transaction time (60). The typed hash includes converted quantities and fixed-point price. Compare it with9002=564350835; mismatches count as errors. - 3. Build
build_8 - Set those twelve business fields and the message header, serialize through the public builder and retain the output length. The receive-side
9002audit marker is not part of this build payload. Execution IDs, sequence numbers and field order may vary by adapter.
Sample build payload · header and framing omitted
The report’s business fields without the receive-side audit marker; not a captured wire result from every builder.
Market data snapshot · 35=W
A ten-level AUD/NZD book: ten bids and ten offers, each sized at 1,000,000. 268=20 counts entries, not levels. Each entry contains side (269=0 bid or 269=1 offer), price (270) and size (271). Best bid/offer are 1.08241 / 1.08245.
Complete pinned input · all twenty entries, with one bid/offer pair per display line
- 1. Parse only
parse_only - Give the complete depth-ten message to the parser. Read symbol (
55), entry count (268) and the first two prices (270), then compare their typed converted-value hash with9001=2376139772. This is a top-of-book check, not extraction of all twenty entries. - 2. Parse and extract
parse_extract - Parse, read request ID (
262), symbol and entry count, then visit all twenty entries in wire order. Read each entry’s side, price and size: 60 group values plus the three leading values. Convert and hash them, then compare with9002=2366019821. Reading only the first bid/offer pair cannot satisfy this check. - 3. Build
build_W - Set request ID and symbol, create
268=20and write the ten bid/offer pairs, then serialize and retain the output length. The payload contains the full book, not a two-entry shortcut. Receive-side audit tags9001and9002are omitted. Falcon W is unsupported: upstream Falcon has no market-data message model, so these three cells are not measured for it.
Sample build payload · all twenty entries, header and framing omitted
The complete book payload without receive-side audit tags; not a captured wire result from every builder.
Builders need not emit identical bytes: IDs, field order, FIX version and number formatting can differ. Most paths finish a framed FIX message; the pinned Java Pure path times header/body serialization without final 8/9/10 framing. That row is not a measurement of a completed on-wire message.
How the separate mutation checks prove field work
These are admission checks, not extra latency rankings. The harness mutates a field while keeping the message’s length and FIX checksum valid, but leaves the expected value hash stale. An adapter passes the probe only when it reports the hash mismatch.
- Report extraction: change
37=EX123456to37=FX123356. The9002check must detect the changed order ID. - Full-book extraction: change the second level’s prices from
1.08240 / 1.08246to1.08250 / 1.08236. The best bid/offer stay unchanged; the full9002check must notice the deeper entries. - Top-of-book check: change
55=AUD/NZDto55=BUD/NYD. The selected Wparse_onlyoperation must detect the stale9001value; rejection by a different operation cannot satisfy the probe. - Numeric conversion: change the order price from
44=1.08245to44=1.08254, or the last book size from271=1000000to271=0100000. These preserve framing but change the converted value and must fail the selected operation’s hash check.
All 332 isolated text/numeric probes pass in the 25-adapter HP campaign. Each supported D/8/W parsing operation must reject its own mutation with a positive error count and exit code 3; rejection by another operation cannot satisfy it. Falcon has eight D/8 probes and llfix twelve receive-field probes; LibHFT C++ adds probes for its cursor and legacy entrypoints, which are diagnostic and not displayed. This is field-work evidence, not full FIX conformance or network performance.
Comparison boundaries
A missing cell is not a measurement.
The page shows each adapter’s default entrypoint for D, 8 and depth-10 W: encoding, checked parsing and parsing + extraction. Cursor, legacy and other diagnostic variants are excluded from these tables.
- Falcon W is unsupported. Falcon has D and 8 results only; selecting market data shows it as not supported, without timings or a rank.
- llfix receive is unranked. Its six receive cells include SDK timestamp, sequence and callback work, so they are listed separately. Its three encoder cells are ranked.
- libtrading depth-10 W uses the retained 128-field capacity patch.
- FerrumFIX uses the pinned v0.7.0 shim.
- LibHFT Java Pure build timing covers header and body serialization without final
8/9/10framing.
Other non-admitted, unsupported or licence-excluded targets are not shown. Their absence here is not evidence of slower performance. JMH runs, llfix reference transport tests and full-session results are separate evidence, outside this codec table.
The page shows 216 ranked D/8/W codec cells and six unranked llfix receive cells. The campaign’s summary CSV retains all 560 operation rows, including administrative messages and the C++ cursor/legacy variants, without mixing those paths into the default ranking.
Recorded methodology
One host. Frozen inputs. Audited windows.
| Host | HP · Intel Xeon Gold 6254 · Linux 5.14.0-687.44.1.el9_8.x86_64 · measurement CPUs 16–17; launcher CPUs 0–7. Hardware epoch record |
|---|---|
| Campaign date | 18 October 2026. This is a pinned codec snapshot, not an assertion about every later release or every deployment. |
| Measured source | LibHFT 5917330b7c2c7d67d01eea58379eca00bd5389bb; later publishing revisions do not change it |
| Method | converted-values-v2: 50,000 timed samples after 5,000 warm-up samples per operation; 32 operations per clock sample |
| Admission | 25/25 build/run gates, 332/332 extraction mutation probes, 560 operation rows and a complete clock contract |
| Host qualification | Passing 120-second quiet-host preflight before each of four audited segments; five-second all-PID monitor; no competing samples at or above 5% CPU in any selected adapter window |
| Selection | Four segments with the same source, prepared runtimes, fixtures, CPU affinity and sample counts. Contaminated windows were excluded, not averaged into the ranking. |
The mutation audit changes wire-valid fields while leaving their expected field hash stale. A passing probe rejects the mismatch, demonstrating that the adapter reads the required fields rather than merely accepting a fixed message.
Peer versions and pinned inputs
Versions are shown where the campaign evidence records one. Other peers are identified by the SHA-256 of the pinned source tree or jar that was compiled and measured; the prepared manifest lists every input.
| Adapter | Recorded version | Pinned input · SHA-256 prefix |
|---|---|---|
| LibHFT .NET Native | LibHFT source 5917330b7c2c | Measured source above |
| LibHFT .NET Pure | LibHFT source 5917330b7c2c | Measured source above |
| LibHFT C++ | LibHFT source 5917330b7c2c | Measured source above |
| LibHFT Java Pure | LibHFT source 5917330b7c2c | Measured source above |
| LibHFT Java/JNI | LibHFT source 5917330b7c2c | Measured source above |
| LibHFT Rust | LibHFT source 5917330b7c2c | Measured source above |
| Artio | 0.178 | artio-codecs-0.178.jar · d4eff79c0958 |
| DFX | Not version-labelled in the evidence | dfx · a20c4e0933f8 |
| Falcon | Not version-labelled in the evidence | falcon-0.1.0-master-SNAPSHOT.jar · fc2085cee1a2 |
| FerrumFIX | v0.7.0 shim | ferrumfix · b381f8e4273a |
| FIX Antenna .NET Core | Not version-labelled in the evidence | fixantenna_net · c4c4ad326f9f |
| Fix8 | Not version-labelled in the evidence | fix8/include · 2c895eb218f9 |
| fixer-rs | Not version-labelled in the evidence | fixer_rs · 2cde38c9dc45 |
| Fixpp | Not version-labelled in the evidence | fixpp/include · 448c4879c106 |
| hffix | Not version-labelled in the evidence | hffix/include · 398621473830 |
| libtrading | Not version-labelled in the evidence | libtrading/include · 175aca29e54d |
| llfix | 1.0.8 | llfix/include · 8b81571731fc |
| NanoFIX | Not version-labelled in the evidence | nanofix · c7b7e48898be |
| NexusFIX | Not version-labelled in the evidence | nexusfix/include · 896323421dac |
| Philadelphia | 2.0.0 | philadelphia-core-2.0.0.jar · 396136037b0f |
| QuickFIX/C++ | Not version-labelled in the evidence | quickfix_cpp/include · a1a5402cc254 |
| QuickFIX/Go | Not version-labelled in the evidence | quickfix_go · f7cc9f36cefa |
| QuickFIX/J | 2.3.1 | quickfixj-core-2.3.1.jar · d063713127ae |
| QuickFIX/n | Not version-labelled in the evidence | quickfix_n · 91bd60612128 |
| TrueFix | Not version-labelled in the evidence | truefix · 3c64f5be84a2 |
Summary CSV SHA-256: dfda98a2cd6d288c44bda4666966ea4941611d2d9f59f78db01576c1a314366c. Prepared manifest SHA-256: 62b830d8b3d7ea45af627c6bb1257b2a92a103e11eec58d6b2c6aeb20692f1ac. Host qualification SHA-256: f63aae7a540c9ec65c7e9c2d41bcf9cda45cbda1c4bb75b1e6e710d629096422. Compact result set SHA-256: ace4e77ba182a372d90e086e287b96deaec65ba78ced16dbc90c647df2148ec4. Prepared manifest · machine-readable snapshot.
Reproduce the pinned measurement procedure
Use the measured source revision, prepared-manifest digest and peer pins above. Preparation and timing are separate; reserve the host CPU slot and review process activity before publishing a result.
python3 bench/cpp/fixbench/tools/open_source_fix_engines/open_source_fix_engine_stage2.py \
--workspace "$LIBHFT_BUILD_ROOT/stage2-workspace" \
--run-prepared --parity-audit --run-cpus 16,17 \
--iterations 50000 --warmup 5000
This command requires the previously prepared, hash-verified workspace; it is not a standalone installation command. Another host joins this comparison only after its own qualification with matching inputs.
Historical campaign
The earlier SCAN campaign (Intel Xeon E5-2698 v4, isolated CPUs 18–19, 2–3 October 2026) measured the same 25 adapters with LibHFT source 4375a8fe and different peer pins: 320 probes and 554 operation rows. It is retained as historical evidence and is not merged into these rankings.