Performance & Interoperabilität
Ausschliesslich unsere eigenen Messwerte, mit der Methodik dahinter — damit jede Zahl einzuordnen ist. Keine Marketing-Grafiken, keine extrapolierten Vergleiche: gemessen wird auf denselben Hosts, mit denselben Tools, gegen die etablierten DDS-Implementierungen.
Alle Latenz-Zahlen sind Roundtrips (Request → Response, halbiert ergibt sich die One-Way-Latenz nicht — wir berichten den vollen Roundtrip). Perzentile statt Mittelwert, weil bei Echtzeit-Systemen der Schwanz zählt. Wo nicht anders genannt: voller DCPS-Pfad (Discovery + RTPS + Reader/Writer-Matching), RELIABLE, KEEP_LAST(64), UDPv4 über Loopback, vanilla Linux ohne RT-Tuning — also der konservative Fall, nicht das getunte Schaufenster.
Roundtrip-Latenz im 5-Vendor-Vergleich
Selber Host, selbe Pipeline, selber Loopback-Pfad für alle fünf Stacks — jeder mit seinem eigenen, vollen DCPS-Stack. Self-Roundtrip, n=2000, 0-Byte-Payload, RELIABLE.
| Stack | p50 | p90 | p99 | p99.9 | max | Status |
|---|---|---|---|---|---|---|
| ZeroDDS | 24.0 | 37.0 | 56.4 | 105 | 121 | schnellstes p50, sauberster Schwanz |
| RTI Connext | 29.4 | 42.0 | 67.7 | 232 | 751 | 2., hoher max-Ausreisser |
| Cyclone DDS | 35.3 | 50.0 | 84.5 | 138 | 180 | reife Referenz-Implementation |
| Fast-DDS | 46.6 | 67.9 | 93.7 | 191 | 425 | — |
| OpenDDS | 338 | 519 | 782 | 1668 | 1739 | ACE/TAO-Overhead |
Werte in µs. p50 = Median. Host: 4-vCPU-Linux-Container, vanilla (kein PREEMPT_RT, kein CPU-Pinning).
- ZeroDDS hat das niedrigste p50 (24 µs) und zugleich den engsten Schwanz — max 121 µs gegenüber 180 µs (Cyclone), 751 µs (RTI). Für ein Echtzeit-System ist der Schwanz oft wichtiger als der Median.
- Payload-Invarianz: über 0–4 KB bleibt ZeroDDS bei ±10 %, die anderen Stacks streuen bis ±50 %.
- Ehrlich: das ist Same-Host-Loopback ohne RT-Tuning. RTI und Cyclone holen mit Pinning/PREEMPT_RT teils auf oder vorbei; getunte Zahlen veröffentlichen wir erst, wenn der RT-Aufbau steht.
Cross-Vendor-Interop
Volle 5×5-Roundtrip-Matrix: jeder Stack als Pinger gegen jeden als Ponger, echte Wire-Interop (Discovery + RTPS + QoS-Matching), nicht nur Discovery-Sichtbarkeit.
| Ping ↓ / Pong → | ZeroDDS | Cyclone | Fast-DDS | RTI | OpenDDS | Score |
|---|---|---|---|---|---|---|
| ZeroDDS | 30 | 38 | 54 | 46 | 81 | 5/5 ✅ |
| Cyclone | 31 | 36 | 54 | 83 | 91 | 5/5 ✅ |
| Fast-DDS | 67 | 35 | 58 | 68 | 115 | 5/5 ✅ |
| RTI | 34 | 65 | 47 | 37 | — | 4/5 |
| OpenDDS | 81 | 123 | 162 | — | 730 | 4/5 |
p50 µs, 0-Byte-Payload. 23/25 Zellen grün — alle drei etablierten Vendoren matchen untereinander und mit ZeroDDS. Die zwei Lücken sind RTI↔OpenDDS (SEDP-Encoding-Mismatch zwischen den Fremd-Vendoren, unabhängig von ZeroDDS).
ROS 2: rmw_zerodds ↔ rmw_cyclonedds Talker/Listener bidirektional 20/20 grün. Live-SPDP-Discovery erkennt Cyclone und Fast-DDS auf demselben Subnetz.
DDS-Security (Cross-Vendor, verschlüsselt)
Roundtrip mit eingeschaltetem data_protection=ENCRYPT (AES-GCM auf User-Payload), 64-Byte-Payload. Interessant ist der Crypto-Aufschlag relativ zur eigenen Plain-Baseline.
| Stack | Plain p50 | Verschlüsselt p50 | Aufschlag |
|---|---|---|---|
| ZeroDDS | 25 | 65 | +40 µs absolut, sauberste Kurve |
| Cyclone | 36 | 44 | +22 % |
| Fast-DDS | 58 | 109 | +88 % |
| OpenDDS | ~90 | 132 | +47 % |
Cross-Vendor verschlüsselt: ZeroDDS matcht in beiden Richtungen über das volle 13-Profil-Governance-Spektrum — 13/13 mit Cyclone, 13/13 mit Fast-DDS, 9/13 mit OpenDDS (das ZeroDDS-Maximum; die vier Lücken sind OpenDDS-Spec-Grenzen, kein ZeroDDS-Bug). Die roten Zellen der Vollmatrix sind ausschliesslich Fremd↔Fremd-Paare (Vendor-Löcher zwischen den anderen Stacks). Das ist echte 4-Vendor-DDS-Security-Interop auf User-Payload-Crypto-Ebene.
TSN — RTPS direkt über Ethernet
Roundtrip des Live-AF_PACKET-Transports (DDS-TSN Annex A, RTPS im Ethernet-Frame, EtherType 0x88B5) gegen eine UDP-Baseline über denselben Link.
| Transport | p50 | p90 | p99 | max | Jitter (p99−p50) |
|---|---|---|---|---|---|
| TSN / AF_PACKET 0x88B5 | 11.95 | 22.49 | 29.58 | 281 | 17.62 |
| UDP (gleicher Link) | 17.10 | 21.07 | 34.90 | 928 | 17.79 |
µs, 64-Byte-Payload. Der Raw-Ethernet-Pfad liegt unter UDP, weil er den IP/UDP-Stack umgeht.
Wichtig zur Einordnung: das ist eine Host-Pfad-Messung ohne TSN-Switch. Der eigentliche TSN-Vorteil — deterministische, eng begrenzte Latenz unter Last — entsteht im Netz (Time-Aware Shaper / gPTP), nicht im Host-Socket. Diese Zahl belegt nur, dass unser Ethernet-Transport keinen Overhead-Nachteil gegenüber UDP hat.
CORBA (Migrations-Pfad)
Für den CORBA-Koexistenz-Stack: IIOP-Roundtrip über TCP-Loopback gegen die etablierten ORBs, plus bidirektionale Cross-ORB-Interop.
| ORB | p50 (32 B) | Cross-ORB-Interop |
|---|---|---|
| ZeroDDS | 16.3 | schnellster ORB im Vergleich |
| omniORB | 17.9 | ✅ |
| TAO | 36.7 | ✅ |
| JacORB | 57.1 | ✅ inkl. Big-Endian-Konvertierung |
Alle sechs Client/Server-Kombinationen gegen omniORB, TAO und JacORB sind bidirektional grün (Echo + Bench), einschliesslich Byte-Order-Konvertierung.
Microbenchmarks (Hot-Path)
Writer-Dispatch — die reine Sample-Send-Kette über RTPS, Criterion-gemessen. Zero-Copy-Fan-out über Arc<[u8]> (kein Payload-Kopieren beim Fan-out):
| Payload | Vec (copy) | Arc (zero-copy) | Δ |
|---|---|---|---|
| 64 B | 390 ns | 390 ns | ±0 % |
| 1 KB | 525 ns | 489 ns | −6.9 % |
| 4 KB | 959 ns | 974 ns | +1.6 % |
| 16 KB | 3.18 µs | 3.09 µs | −2.8 % |
| 64 KB | 11.49 µs | 11.04 µs | −3.9 % |
Methodik — wie gemessen wird
- Hosts: zwei saubere Maschinen — ein 4-vCPU-Linux-Container (AMD) und ein Bare-Metal-Apple-M1. Jede Zahl nennt ihren Host.
- Atomic-Pipeline: frischer Prozess-Baum pro Matrix-Zelle, isolierte Domain-IDs, kein geteilter Shell-Zustand — keine Cross-Contamination zwischen Messungen.
- QoS: RELIABLE, KEEP_LAST(64), XCDR1/XCDR2, UDPv4 über Loopback (kein physisches Netz, also kein Switch-/Kabel-Jitter).
- Sampling: 200 Warmup + 2000 Messwerte pro Zelle; p50 ist der Median, robust gegen Einzel-Ausreisser. Roh-Histogramme im Repo.
- Tuning: vanilla, sofern nicht anders genannt — kein PREEMPT_RT, kein
isolcpus, keinchrt. Das ist bewusst der konservative Fall. - Vendor-Versionen: Cyclone DDS 11.0.1, Fast-DDS 3.6.1, RTI Connext 7.7.0, OpenDDS 3.34.0 — jeweils mit ihrem eigenen Bordmittel-Bench auf demselben Pfad.
Offene Punkte & Grenzen (ehrlich)
- RT-getunte Zahlen fehlen noch. Das sub-µs-Regime (PREEMPT_RT + Pinning) ist noch nicht reproduzierbar aufgebaut; die hier gezeigten Zahlen sind vanilla.
- RTI ↔ OpenDDS matchen untereinander nicht (SEDP-Encoding-Mismatch der beiden Fremd-Vendoren) — kein ZeroDDS-Problem.
- TSN cross-vendor über den 0x88B5-Ethernet-PSM ist heute nicht möglich: kein anderer Vendor liefert das OMG-Annex-A-Wireformat interoperabel aus.
- Kommerzielle Pro-Ligen (RTI Pro, Fast-DDS Pro mit Custom-Allocator/Lock-Free-Ring) messen wir bewusst nicht gegen — wir veröffentlichen keine unfairen Vergleiche. Siehe Hard Truths.
Reproduzierbarkeit
Alle Messungen sind reproduzierbar dokumentiert. Wenn du die Zahlen in deiner Umgebung nicht reproduzierst, ist das ein Issue wert. Roh-Daten und Skripte:
- tools/bench-suite — Criterion-Suite + Roundtrip-Binaries
- tests/perf — Roundtrip-Matrix, TSN-Latenz, Soak-Runner
- tests/interop — Cross-Vendor- und ROS-2-Interop-Harness
Weiter: Features · Hard Truths · Kontakt