Tinverse logo Tinverse LLC

DDS Benchmarking Suite

Comparable DDS Measurements

Published measurements for tin-dds, Retina, CycloneDDS, iceoryx, Fast DDS, and RTI Connext. Network results use separate publisher and subscriber processes on one host. Local fanout results measure one participant delivering to as many as 16 readers. Internal shared-memory mechanisms and full DDS paths are shown separately. Network latency is reported as a one-way estimate (RTT ÷ 2). Local fanout latency is measured directly.

64 B–4 KiB Payload sweep

Complete reliable DDS exchanges at three application payload sizes.

p50–p99.9 Latency range

The charts keep typical and tail behavior visible on one scale.

0 lost Measured cohorts

Every five-implementation run completed all 10,000 measured exchanges without reported loss.

Complete DDS measurement boundary

The complete DDS charts time every application stage from write() to take(). Discovery and matching happen before the timer starts.

The nine stages of a complete DDS publication and the narrower shared-memory mechanism measurement.
Before timing Participant setup → SPDP/SEDP discovery → endpoint matching → warm-up
  1. 1Application writeswrite()
  2. 2Serialize dataCDR encoding
  3. 3Track deliveryWriter history + reliability
  4. 4Build messageRTPS DATA framing
  5. 5Move the dataSHM handoff or UDP
  6. 6Parse messageRTPS parsing
  7. 7Order and storeReader reliability + history
  8. 8Decode dataCDR deserialization
  9. 9Application takestake()
Complete DDS charts Stages 1–9 are timed
After timing Terminal reliable acknowledgement completes after the measured application exchange

Current Tin DDS and Retina build

This current-source cohort exchanged the same 64-byte application sample between two CPU-pinned processes over reliable UDP. Each implementation completed five interleaved runs of 10,000 measured round trips after 500 warm-up exchanges. The timer covers the complete public write()-to-take() path, and all 100,000 measured exchanges arrived without loss, duplication, or rejection.

Current reliable UDP latency Bar: p50; whisker: p99.9. One-way estimate from measured ping/echo RTT. Lower is better.

Loading current-source latency chart…

Current completed exchanges per second Sequential ping/echo rate calculated from every measured round trip. Higher is better.

Loading current-source completion-rate chart…

Implementationp50p99p99.9Exchanges/s
Tin DDS 0.1.05.75 µs7.96 µs11.63 µs82,262
Retina 0.1.06.54 µs9.24 µs11.59 µs74,051

The median statistics come from one ARM64 host session. Its scheduler and power state can move absolute latency, so this cohort remains separate from the earlier five-implementation comparison. The machine-readable matrix links to all ten raw observation artifacts and their source and compiler metadata.

Five DDS implementations, one workload

Tin DDS, Retina, CycloneDDS, Fast DDS, and RTI Connext each exchange the same 64-byte application sample between two processes over reliable UDP. Discovery and 500 warm-up exchanges finish before 10,000 observations are retained. The charts report the median statistic from five interleaved, CPU-pinned runs on one ARM64 Linux host. Batching is off and durability is volatile for every implementation. Each row is a homogeneous pair of that implementation; this chart measures performance, not mixed-vendor interoperability.

Typical latency and the p99.9 tail Bar: p50; whisker: p99.9. One-way estimate from measured ping/echo RTT. Lower is better.

Loading head-to-head latency chart…

RTT-derived exchanges per second Sequential ping/echo rate calculated from the measured round-trip observations. Higher is better.

Loading head-to-head completion-rate chart…

Exact numeric values
Implementationp50p99p99.9Exchanges/s
Tin DDS 0.1.05.20 µs6.92 µs10.50 µs93,223
Retina 0.1.06.43 µs9.09 µs10.91 µs75,052
CycloneDDS 0.10.416.36 µs18.65 µs77.42 µs30,006
Fast DDS 2.14.619.26 µs26.05 µs40.56 µs24,692
RTI Connext 7.7.022.00 µs34.00 µs156.00 µs22,464

Every run retained exactly 10,000 observations and completed without a reported lost exchange. The machine-readable matrix links to all 25 run artifacts and their raw latency observations.

Reliable DDS latency as payload size grows

Tin DDS and Retina completed 90,000 reliable round trips through their public writer and reader APIs with zero lost samples. Each run establishes discovery and endpoint matching before 500 warm-up exchanges, then measures serialization, reliability, history, UDP transport, and application delivery. The table reports the median of three interleaved runs on a provenance-complete, slim Tinverse Linux Guix GCP runner image.

Typical latency and the long tail Each bar ends at p50; its whisker ends at p99.9. Lower is better.

Loading latency chart…

Completed exchanges per second Application round trips completed with every sample delivered. Higher is better.

Loading completion-rate chart…

PayloadTin DDS p50Tin DDS p99Retina p50Retina p99
64 B3.97 µs5.75 µs2.85 µs4.58 µs
1 KiB4.28 µs5.97 µs3.16 µs4.94 µs
4 KiB6.47 µs8.54 µs8.78 µs11.21 µs

These runs used the Tinverse Linux v4-lto policy on a c3-standard-4 VM, with publishers pinned to CPU 1 and subscribers to CPU 3.

Complete DDS publish-to-receive latency

These Retina results measure from the application calling write() until the receiving application obtains the sample with take(). Each direction includes CDR serialization, writer history and reliability, RTPS DATA framing, shared memory or UDP, RTPS parsing, reader reliability and history, and CDR deserialization. SPDP/SEDP discovery, endpoint matching, and warm-up finish before timing begins.

Shared memory versus UDP latency Complete application publish-to-receive path on each architecture. Lower is better.

Loading transport-latency chart…

Complete round trips per second The rate includes the same complete DDS path as the latency chart. Higher is better.

Loading transport-rate chart…

ArchitectureTransportp50p99p99.9MaximumRound trips/s
x86-64UDP5.401 µs6.980 µs8.193 µs138.893 µs90,043
x86-64Shared memory0.971 µs1.521 µs2.188 µs71.543 µs465,394
ARM64UDP8.838 µs12.157 µs15.972 µs3.408 ms59,084
ARM64Shared memory3.217 µs3.921 µs5.102 µs4.226 ms149,227

Each row is the median of five interleaved one-million-sample runs. The latency is a one-way estimate obtained by dividing a complete ping-pong round trip by two. Every run delivered every sample without loss or retransmission. The machine-readable result records the measurement boundary, aggregation, and delivery counters.

Reliable when delivery is disrupted

Tin DDS and Retina each recovered every one of 15,000 trials for four RTPS reliability behaviors: rejecting duplicate data, accepting data that arrives out of order, requesting a missing sequence, and requesting a missing fragment. Across both implementations, all 120,000 trials completed successfully.

Reliability behaviorTin DDSRetina
Duplicate data rejected15,000 / 15,00015,000 / 15,000
Out-of-order data accepted15,000 / 15,00015,000 / 15,000
Missing sequence requested15,000 / 15,00015,000 / 15,000
Missing fragment requested15,000 / 15,00015,000 / 15,000

These deterministic checks isolate the reliability mechanisms from the network. Their internal timings cover different amounts of work, so the result reported here is recovery correctness, not a speed ranking. The summary and complete trial records are available for inspection.

Reliable and best-effort local fanout

One write was delivered to 1, 4, or 16 readers through each implementation's DDS history and matching logic. Tin DDS and Retina completed 180,000 measured write-and-take iterations with no lost, duplicate, or rejected deliveries. The Release runs alternate implementation order and retain every latency sample.

Local fanout measurement Public write, local DDS state and matching, then take from every reader. No RTPS transport is involved.
  1. 1 Write
  2. 2 Serialize
  3. 3 Writer state
  4. 4 Frame
  5. 5 Transport
  6. 6 Parse
  7. 7 Reader state
  8. 8 Deserialize
  9. 9 Take
Best-effort fanout latency One write followed by a take from every reader. Bar: p50; whisker: p99.

Loading best-effort fanout chart…

Reliable fanout latency One write followed by a take from every reader. Bar: p50; whisker: p99.

Loading reliable fanout chart…

Exact numeric values
ImplementationQoSReadersp50p99Deliveries/s
Tin DDSBest effort1287 ns324 ns2.65M
Tin DDSBest effort4574 ns620 ns5.92M
Tin DDSBest effort161.70 µs1.93 µs8.91M
RetinaBest effort1426 ns473 ns1.87M
RetinaBest effort4602 ns981 ns5.61M
RetinaBest effort161.72 µs3.04 µs8.58M
Tin DDSReliable1296 ns445 ns2.49M
Tin DDSReliable4583 ns982 ns5.94M
Tin DDSReliable161.67 µs2.50 µs9.00M
RetinaReliable1315 ns565 ns2.42M
RetinaReliable4621 ns1.05 µs4.88M
RetinaReliable161.69 µs1.89 µs8.98M

Latency is one complete logical iteration: one write followed by a take from every reader. Delivery rate counts reader deliveries, so it rises with fanout. This is local DDS dispatch, not UDP latency. See the summary and raw child artifacts.

Performance with the DDS behavior included

The reliable UDP results exercise public typed writers and readers in separate processes. Discovery, endpoint matching, serialization, reliability, history, transport, and application delivery are part of the path. A run passes only when its delivery accounting is complete; latency alone is not enough.

Typed end to end

The application writes and receives concrete data types, not transport test packets.

Delivery is measured

Artifacts retain sent, received, lost, duplicate, and rejected sample counts when the runner provides them.

Scopes stay separate

Shared-memory mechanism timings are never presented as though they were a vendor's complete DDS path.

Split-process cohort (July–August 2026)

Every row uses a publisher and subscriber in separate persistent processes on one host. Measurements were collected on an ARM64 system and an x86-64 system. The linked artifacts record the workload and measurement method; duration-based vendor tools may complete a different number of round trips than the fixed-iteration tin-dds and Retina runners.

Stage 5 only: shared-memory handoff

These rows time direct payload-slot and notification work. They do not include the public writer and reader APIs, serialization, DDS history, RTPS framing and parsing, or deserialization.

Shared-memory mechanism measurement Only the transport handoff is timed; the surrounding DDS stages are outside this measurement.
  1. 1 Write
  2. 2 Serialize
  3. 3 Writer state
  4. 4 Frame
  5. 5 Transport
  6. 6 Parse
  7. 7 Reader state
  8. 8 Deserialize
  9. 9 Take
Implementationp50p99
tin-dds (daemon segment, loaned payload)412 ns486 ns
Retina (daemon loan and SHM notification rings)434 ns490 ns

Full DDS shared-memory references

Implementationp50p99
RTI Connext 7.7 (full DDS over SHMEM)5,000 ns6,000 ns
Fast DDS 2.6 (data-sharing zero-copy)9,030 ns10,813 ns

Reliable UDP, two processes

Five implementations on x86-64 Bar: p50; whisker: p99. Historical same-host cohort. Lower is better.

Loading x86-64 implementation comparison…

Implementationp50p99Round trips/s
tin-dds3,171 ns3,318 ns157,105
Retina1,997 ns3,128 ns243,099
RTI Connext 7.76,000 ns11,000 ns56,204
CycloneDDS 0.10.5 (ddsperf)2,378 ns3,044 ns
Fast DDS 2.69,336 ns12,409 ns

The rows share a process topology and payload size. Mechanism tables time loan and notification work; full DDS tables include their implementation's wider DDS path. Those scopes are deliberately separated and are not ranked against each other. Treat these as same-host reference points, not universal rankings: CPU scheduling, power mode, configuration, and payload size all affect the result.

The ARM64 UDP rows were refreshed together on August 18, 2026 using the matched five-implementation workload above. The x86-64 reference rows and ARM64 shared-memory mechanism rows come from their separately linked cohorts and are not mixed into that ranking.