AtrekesLibHFTDocumentationMicrobenchmarks

Inside the FIX codec

FIX codec microbenchmarks.

Measure the work behind each message: parsing, reading fields and constructing FIX messages. Compare all six LibHFT flavors with their language peers in one qualified, in-process benchmark campaign.

25 licensed adapters6 LibHFT flavorsNanoseconds / operationQualified · 3 October 2026

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.

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 →

Values are ns/operation. Each sample averages 32 in-process operations, not a network round trip. 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 and libtrading.

Encoding

Field values → FIX bytes

NewOrderSingle · encoding · ns/operation
Engine / codecp50p99
LibHFT C++7072
hffix197200
llfix (encoder)462466
NexusFIX542552
libtrading660668
QuickFIX/C++3,6953,711
Fix84,0134,040
Fixpp4,1404,162
CDF & all percentiles
LibHFT C++hffixllfix (encoder)NexusFIXlibtrading
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 ↗
NewOrderSingle · encoding · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT C++70727273
2hffix197199200201
3llfix (encoder)462464466469
4NexusFIX542549552554
5libtrading660663668670
6QuickFIX/C++3,6953,7023,7113,718
7Fix84,0134,0294,0404,048
8Fixpp4,1404,1524,1624,168
How this test works →

Checked parsing

FIX bytes → checked field values

NewOrderSingle · checked parsing · ns/operation
Engine / codecp50p99
LibHFT C++446447
hffix506517
NexusFIX1,0071,014
Fixpp1,4591,463
libtrading2,1382,147
QuickFIX/C++3,0003,018
Fix87,2787,307
llfix (encoder)Encoder only · no receive-parser result
CDF & all percentiles
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 ↗
NewOrderSingle · checked parsing · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT C++446446447449
2hffix506508517517
3NexusFIX1,0071,0081,0141,016
4Fixpp1,4591,4611,4631,467
5libtrading2,1382,1442,1472,150
6QuickFIX/C++3,0003,0093,0183,032
7Fix87,2787,2957,3077,318
—llfix (encoder)Encoder only · no receive-parser result
How this test works →

Parsing + extraction

FIX bytes → extracted business fields

NewOrderSingle · parsing + extraction · ns/operation
Engine / codecp50p99
LibHFT C++445446
hffix498511
NexusFIX1,0001,004
Fixpp1,4561,460
libtrading2,1362,144
QuickFIX/C++3,0093,021
Fix87,2877,315
llfix (encoder)Encoder only · no receive-parser result
CDF & all percentiles
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 ↗
NewOrderSingle · parsing + extraction · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT C++445445446449
2hffix498499511512
3NexusFIX1,0001,0021,0041,005
4Fixpp1,4561,4581,4601,462
5libtrading2,1362,1402,1442,146
6QuickFIX/C++3,0093,0163,0213,029
7Fix87,2877,3027,3157,327
—llfix (encoder)Encoder only · no receive-parser result
How this test works →

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

NewOrderSingle · encoding · ns/operation
Engine / codecp50p99
Philadelphia5372,268
LibHFT Java Pure5611,578
LibHFT Java/JNI5641,311
Falcon1,3901,690
Artio1,7553,574
QuickFIX/J1,9708,131
CDF & all percentiles
PhiladelphiaLibHFT Java PureLibHFT Java/JNIFalconArtio
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 ↗
NewOrderSingle · encoding · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1Philadelphia5375442,2682,421
2LibHFT Java Pure5618441,5787,208
3LibHFT Java/JNI5647631,3112,540
4Falcon1,3901,4551,6906,871
5Artio1,7551,9853,574240,086
6QuickFIX/J1,9702,4228,131387,550
How this test works →

Checked parsing

FIX bytes → checked field values

NewOrderSingle · checked parsing · ns/operation
Engine / codecp50p99
LibHFT Java Pure8272,916
LibHFT Java/JNI1,0791,991
Falcon1,0884,511
Philadelphia1,2893,940
QuickFIX/J2,4408,502
Artio2,9229,429
CDF & all percentiles
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 ↗
NewOrderSingle · checked parsing · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT Java Pure8278332,9163,635
2LibHFT Java/JNI1,0791,0831,9912,138
3Falcon1,0881,0954,5117,469
4Philadelphia1,2891,2983,9407,835
5QuickFIX/J2,4402,4578,50212,875
6Artio2,9223,7159,429409,800
How this test works →

Parsing + extraction

FIX bytes → extracted business fields

NewOrderSingle · parsing + extraction · ns/operation
Engine / codecp50p99
LibHFT Java Pure826851
LibHFT Java/JNI1,0791,115
Falcon1,0931,135
Philadelphia1,2921,313
QuickFIX/J2,4422,637
Artio2,9223,105
CDF & all percentiles
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 ↗
NewOrderSingle · parsing + extraction · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT Java Pure826830851945
2LibHFT Java/JNI1,0791,0821,1151,330
3Falcon1,0931,0971,1357,573
4Philadelphia1,2921,2961,3137,566
5QuickFIX/J2,4422,4542,6373,270
6Artio2,9222,9533,1053,660
How this test works →

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

NewOrderSingle · encoding · ns/operation
Engine / codecp50p99
LibHFT .NET Pure2731,651
LibHFT .NET Native361719
FIX Antenna .NET Core3,41414,387
QuickFIX/n6,30220,337
CDF & all percentiles
LibHFT .NET PureLibHFT .NET NativeFIX 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 ↗
NewOrderSingle · encoding · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT .NET Pure2734801,6511,687
2LibHFT .NET Native361710719726
3FIX Antenna .NET Core3,4143,48314,38720,873
4QuickFIX/n6,3026,33720,33733,693
How this test works →

Checked parsing

FIX bytes → checked field values

NewOrderSingle · checked parsing · ns/operation
Engine / codecp50p99
LibHFT .NET Native8612,837
LibHFT .NET Pure1,3123,895
FIX Antenna .NET Core2,3424,448
QuickFIX/n6,9139,253
CDF & all percentiles
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 ↗
NewOrderSingle · checked parsing · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT .NET Native8618632,8373,004
2LibHFT .NET Pure1,3121,3143,8954,170
3FIX Antenna .NET Core2,3422,3654,4486,414
4QuickFIX/n6,9136,9469,25311,701
How this test works →

Parsing + extraction

FIX bytes → extracted business fields

NewOrderSingle · parsing + extraction · ns/operation
Engine / codecp50p99
LibHFT .NET Native837841
LibHFT .NET Pure1,3831,395
FIX Antenna .NET Core2,4382,495
QuickFIX/n6,9107,068
CDF & all percentiles
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 ↗
NewOrderSingle · parsing + extraction · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT .NET Native837839841859
2LibHFT .NET Pure1,3831,3891,3951,399
3FIX Antenna .NET Core2,4382,4572,4956,493
4QuickFIX/n6,9106,9397,06811,636
How this test works →

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

NewOrderSingle · encoding · ns/operation
Engine / codecp50p99
LibHFT Rust183184
NanoFIX212215
FerrumFIX1,6241,659
TrueFix2,2512,266
fixer-rs5,4405,464
DFX7,8987,925
CDF & all percentiles
LibHFT RustNanoFIXFerrumFIXTrueFixfixer-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 ↗
NewOrderSingle · encoding · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT Rust183183184185
2NanoFIX212214215216
3FerrumFIX1,6241,6371,6591,664
4TrueFix2,2512,2592,2662,298
5fixer-rs5,4405,4545,4645,474
6DFX7,8987,9117,9258,038
How this test works →

Checked parsing

FIX bytes → checked field values

NewOrderSingle · checked parsing · ns/operation
Engine / codecp50p99
LibHFT Rust646650
NanoFIX2,6522,701
TrueFix2,8242,832
DFX3,6593,673
fixer-rs5,8155,835
FerrumFIX11,36811,420
CDF & all percentiles
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 ↗
NewOrderSingle · checked parsing · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT Rust646648650651
2NanoFIX2,6522,6902,7012,708
3TrueFix2,8242,8282,8322,836
4DFX3,6593,6673,6733,681
5fixer-rs5,8155,8255,8355,846
6FerrumFIX11,36811,39811,42011,446
How this test works →

Parsing + extraction

FIX bytes → extracted business fields

NewOrderSingle · parsing + extraction · ns/operation
Engine / codecp50p99
LibHFT Rust636639
NanoFIX2,6272,649
TrueFix2,8212,829
DFX3,6533,666
fixer-rs5,8225,840
FerrumFIX10,87510,923
CDF & all percentiles
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 ↗
NewOrderSingle · parsing + extraction · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1LibHFT Rust636638639642
2NanoFIX2,6272,6402,6492,658
3TrueFix2,8212,8252,8292,836
4DFX3,6533,6603,6663,677
5fixer-rs5,8225,8315,8405,849
6FerrumFIX10,87510,90110,92310,943
How this test works →

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

NewOrderSingle · encoding · ns/operation
Engine / codecp50p99
QuickFIX/Go11,626370,492
CDF & all percentiles
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 ↗
NewOrderSingle · encoding · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1QuickFIX/Go11,62619,823370,492501,821
How this test works →

Checked parsing

FIX bytes → checked field values

NewOrderSingle · checked parsing · ns/operation
Engine / codecp50p99
QuickFIX/Go3,5216,938
CDF & all percentiles
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 ↗
NewOrderSingle · checked parsing · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1QuickFIX/Go3,5216,5656,938138,349
How this test works →

Parsing + extraction

FIX bytes → extracted business fields

NewOrderSingle · parsing + extraction · ns/operation
Engine / codecp50p99
QuickFIX/Go3,5207,026
CDF & all percentiles
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 ↗
NewOrderSingle · parsing + extraction · ns/operation · ranked by p50
RankEngine / codecp50 (ns)p90 (ns)p99 (ns)p99.9 (ns)
1QuickFIX/Go3,5206,6187,026137,426
How this test works →

What the test measures

Three operations. Shared messages.

WRITE

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.

PARSE

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.

READ

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 →

Codec cost is not deployed FIX latency.

These measurements exclude networking, Logon, sequence recovery, storage and application callbacks. 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-only operation
Pinned bytes enter the public parser. D and 8 check the complete converted business-field set; W checks top of book. The typed value hash is checked inside each operation. One clock sample covers 32 repeated operations. Open diagram ↗

Parse and extract: the reads are inside the sample.

Parse-and-extract operation
Parse the pinned message, convert and hash the full common field set. D checks nine fields; 8 checks twelve; W checks all 20 entries in order. For D/8 the two parse labels now perform the same checked work. One timed sample batches 32 operations. Open diagram ↗

Build: start from values, not a received message.

Message-building operation
Start from field values, populate the public builder, serialize and consume output length. Framing depends on the adapter. One timed sample batches 32 complete build operations. Open diagram ↗

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

8=FIX.4.2|9=161|35=D|49=CLIENT|56=SERVER|34=8|52=20260703-19:28:00.123|
11=ORD123456|21=1|55=AUD/NZD|54=1|60=20260703-19:28:00.123|38=100000|40=2|44=1.08245|59=0|9002=2863910631|
10=021|
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 with 9002=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
35=D|
11=ORD123456|21=1|55=AUD/NZD|54=1|60=20260703-19:28:00.123|38=100000|40=2|44=1.08245|59=0|

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

8=FIX.4.2|9=193|35=8|49=CLIENT|56=SERVER|34=9|52=20260703-19:28:00.123|
37=EX123456|17=EXRPT1|11=ORD123456|150=0|39=0|55=AUD/NZD|54=1|38=100000|151=100000|14=0|6=0.00000|60=20260703-19:28:00.123|9002=564350835|
10=162|
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 with 9002=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 9002 audit 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
35=8|
37=EX123456|17=EXRPT1|11=ORD123456|150=0|39=0|55=AUD/NZD|54=1|38=100000|151=100000|14=0|6=0.00000|60=20260703-19:28:00.123|

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

8=FIX.4.2|9=723|35=W|49=CLIENT|56=SERVER|34=10|52=20260703-19:28:00.123|
262=REQ-AUDNZD-1|55=AUD/NZD|268=20|
269=0|270=1.08241|271=1000000|269=1|270=1.08245|271=1000000|
269=0|270=1.08240|271=1000000|269=1|270=1.08246|271=1000000|
269=0|270=1.08239|271=1000000|269=1|270=1.08247|271=1000000|
269=0|270=1.08238|271=1000000|269=1|270=1.08248|271=1000000|
269=0|270=1.08237|271=1000000|269=1|270=1.08249|271=1000000|
269=0|270=1.08236|271=1000000|269=1|270=1.08250|271=1000000|
269=0|270=1.08235|271=1000000|269=1|270=1.08251|271=1000000|
269=0|270=1.08234|271=1000000|269=1|270=1.08252|271=1000000|
269=0|270=1.08233|271=1000000|269=1|270=1.08253|271=1000000|
269=0|270=1.08232|271=1000000|269=1|270=1.08254|271=1000000|
9001=2376139772|9002=2366019821|10=214|
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 with 9001=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 with 9002=2366019821. Reading only the first bid/offer pair cannot satisfy this check.
3. Build build_W
Set request ID and symbol, create 268=20 and 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 tags 9001 and 9002 are omitted. Falcon has no W codec model in this campaign, so these three cells are not measured for it.
Sample build payload · all twenty entries, header and framing omitted
35=W|
262=REQ-AUDNZD-1|55=AUD/NZD|268=20|
269=0|270=1.08241|271=1000000|269=1|270=1.08245|271=1000000|
269=0|270=1.08240|271=1000000|269=1|270=1.08246|271=1000000|
269=0|270=1.08239|271=1000000|269=1|270=1.08247|271=1000000|
269=0|270=1.08238|271=1000000|269=1|270=1.08248|271=1000000|
269=0|270=1.08237|271=1000000|269=1|270=1.08249|271=1000000|
269=0|270=1.08236|271=1000000|269=1|270=1.08250|271=1000000|
269=0|270=1.08235|271=1000000|269=1|270=1.08251|271=1000000|
269=0|270=1.08234|271=1000000|269=1|270=1.08252|271=1000000|
269=0|270=1.08233|271=1000000|269=1|270=1.08253|271=1000000|
269=0|270=1.08232|271=1000000|269=1|270=1.08254|271=1000000|

The complete book payload without receive-side audit tags; not a captured wire result from every builder.

Read build timings at the adapter’s actual boundary.

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=EX123456 to 37=FX123356. The 9002 check must detect the changed order ID.
  • Full-book extraction: change the second level’s prices from 1.08240 / 1.08246 to 1.08250 / 1.08236. The best bid/offer stay unchanged; the full 9002 check must notice the deeper entries.
  • Top-of-book check: change 55=AUD/NZD to 55=BUD/NYD. The selected W parse_only operation must detect the stale 9001 value; rejection by a different operation cannot satisfy the probe.
  • Numeric conversion: change the order price from 44=1.08245 to 44=1.08254, or the last book size from 271=1000000 to 271=0100000. These preserve framing but change the converted value and must fail the selected operation’s hash check.

320 isolated text/numeric probes pass. 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; llfix has encoder checks, not receive-parser probes. This is field-work evidence, not full FIX conformance or network performance.

Comparison boundaries

A missing cell is not a measurement.

Falcon supports the D and 8 fixtures in this campaign, but has no W codec model. Selecting market data shows it as not applicable, without timings or a rank.

llfix supplies three admitted encoder results: D, 8 and W build. Parsing selections show it as encoder-only, unranked and without invented timings. Its public source does not provide an admitted receive-parser/full-session path; a substitute parser is not an llfix engine result.

Other non-admitted, unsupported or licence-excluded targets stay in the complete engine roster. Their absence here is not evidence of slower performance. Historical, diagnostic and failed runs remain in the archive, outside these qualified tables.

The page shows 216 common D/8/W operation rows. The source report retains all 554 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.

HostSCAN · Intel Xeon E5-2698 v4 · Linux · isolated CPUs 18–19; launcher on CPUs 0–9
Samples50,000 timed samples after 5,000 warm-up samples per operation; 32 operations per clock sample
Admission25/25 normal build/run gates, 320/320 extraction mutation probes, 554 operation rows and a complete clock contract
Host qualificationImmediate passing 120-second quiet-host preflight; five-second all-PID monitor; no competing samples at or above 5% CPU in any selected adapter window
SelectionTwo audited timing segments with the same source, prepared runtimes, fixtures, CPU affinity and sample counts. Contaminated windows were excluded and repaired, not averaged into the ranking.
Campaign date2–3 October 2026. This is a pinned historical codec snapshot, not an assertion about every later release or every deployment.

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.

Summary CSV SHA-256: fd1afadaf5f82aef7c2a05fb09b32675f4841ad27069e1c13329cbc3e0f83ceb. Download the page’s machine-readable snapshot.

Reproduce the pinned measurement procedure

Use the source revision, prepared-manifest digest and dependency pins from the campaign record. 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 18,19 \
  --iterations 50000 --warmup 5000

This command requires the previously prepared, hash-verified workspace; it is not a standalone installation command. The full campaign record documents preparation, quiet-host gates and publication checks.