Order to confirmation
Timed from order submit to the order appearing on the venue's own account feed, not to an acknowledgement of receipt: confirmation is the point the order is live in the book and can be filled.
Order → Confirmation
Updated
3-day windowLower is better
Each mark = one measured order20× slow motion
| Endpoint | Median latency | Orders measured |
|---|---|---|
| Bullet (direct) | 7.9ms median | n=4,299 |
| Lighter | 9.9ms median | n=4,319 |
| Bullet (via Cloudflare) | 12.8ms median | n=4,278 |
| Nado | 15.9ms median | n=4,104 |
| Pacifica | 18.3ms median | n=4,319 |
| Aster | 101ms median | n=4,315 |
| Hyperliquid | 451ms median | n=3,714 |
Tail latency
- Bullet (direct)35.0 ms58.1 msBullet (direct): median 7.9 ms, p99 35.0 ms, p99.9 54.6 ms, slowest 58.1 ms.
- Lighter62.0 ms721 msLighter: median 9.9 ms, p99 62.0 ms, p99.9 269 ms, slowest 721 ms.
- Bullet (via Cloudflare)30.5 ms236 msBullet (via Cloudflare): median 12.8 ms, p99 30.5 ms, p99.9 105 ms, slowest 236 ms.
- Nado4,499 ms8,428 msNado: median 15.9 ms, p99 4,499 ms, p99.9 6,732 ms, slowest 8,428 ms.
- Pacifica40.8 ms69.0 msPacifica: median 18.3 ms, p99 40.8 ms, p99.9 58.2 ms, slowest 69.0 ms.
- Aster147 ms219 msAster: median 101 ms, p99 147 ms, p99.9 189 ms, slowest 219 ms.
- Hyperliquid874 ms7,282 msHyperliquid: median 451 ms, p99 874 ms, p99.9 2,277 ms, slowest 7,282 ms.
Log scale. Lower is better.
| Endpoint | Orders | p50 | p99 | p99.9 | Slowest | Over 100 ms | Over 250 ms | Over 500 ms |
|---|---|---|---|---|---|---|---|---|
| Bullet (direct) | 4,299 | 7.9 ms | 35.0 ms | 54.6 ms | 58.1 ms | 0 | 0 | 0 |
| Lighter | 4,319 | 9.9 ms | 62.0 ms | 269 ms | 721 ms | 26 | 6 | 1 |
| Bullet (via Cloudflare) | 4,278 | 12.8 ms | 30.5 ms | 105 ms | 236 ms | 13 | 0 | 0 |
| Nado | 4,104 | 15.9 ms | 4,499 ms | 6,732 ms | 8,428 ms | 1,264 | 1,051 | 873 |
| Pacifica | 4,319 | 18.3 ms | 40.8 ms | 58.2 ms | 69.0 ms | 0 | 0 | 0 |
| Aster | 4,315 | 101 ms | 147 ms | 189 ms | 219 ms | 2,225 | 0 | 0 |
| Hyperliquid | 3,714 | 451 ms | 874 ms | 2,277 ms | 7,282 ms | 3,714 | 3,714 | 1,066 |
Quoting means cancelling: every time the price moves, the order resting at the old one has to go. Cancels carry the same tail as orders, so one cancel in a hundred takes at least your p99 to land. Until it lands, your stale quote is still resting where the fastest taker on the other side can lift it. That is latency arbitrage, and it is paid out of your PnL.
The length of each exposure is set by p99, not p50. The frequency is set by your quote rate. Per $1M quoted, one basis point of adverse selection is $100. At 100 orders a second you settle that bill once a second.
- Window
- 72 hours to 2026-10-16 20:11 UTC · 29,348 orders · 7 endpoints
- Timed
- One interval per order: submit to account-feed confirmation. The cancel that follows is not in it, and neither is signing. No network-floor subtraction, no speed-bump adjustment.
- Harness
- One m8gd.2xlarge in ap-northeast-1d. One client, one clock, identical for every endpoint.
- Orders
- One order per measurement, one measurement a minute per endpoint, submitted singly and cancelled once it confirms. Post-only, so it rests or is rejected and never trades. Batch submissions are excluded.
- Transport
- One WebSocket per endpoint, held open across measurements. No order opens a connection, so no figure here includes a TCP or TLS handshake. What is timed is the venue and the round trip.
- Endpoints
- Bullet (direct) hits our trading API load balancer with nothing in front of it. Bullet (via Cloudflare) is the same engine behind Cloudflare, which is there to absorb abuse and charges latency and a good deal of jitter for it, so market makers take the direct path.
- Volleys
- A display grouping on the track. Orders do not arrive synchronised across venues.
- Cancels
- Measured separately by the same collector and not shown here: a long order tail means a long cancel tail.
- Prior art
- Inspired by Check the Chain's benchmark. Ours is written from scratch in Rust, so no garbage collector can pause the harness in the middle of a measurement.