Performance & Interoperabilität

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.

Stackp50p90p99p99.9maxStatus
ZeroDDS24.037.056.4105121schnellstes p50, sauberster Schwanz
RTI Connext29.442.067.72327512., hoher max-Ausreisser
Cyclone DDS35.350.084.5138180reife Referenz-Implementation
Fast-DDS46.667.993.7191425
OpenDDS33851978216681739ACE/TAO-Overhead

Werte in µs. p50 = Median. Host: 4-vCPU-Linux-Container, vanilla (kein PREEMPT_RT, kein CPU-Pinning).

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 →ZeroDDSCycloneFast-DDSRTIOpenDDSScore
ZeroDDS30385446815/5 ✅
Cyclone31365483915/5 ✅
Fast-DDS673558681155/5 ✅
RTI346547374/5
OpenDDS811231627304/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_zeroddsrmw_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.

StackPlain p50Verschlüsselt p50Aufschlag
ZeroDDS2565+40 µs absolut, sauberste Kurve
Cyclone3644+22 %
Fast-DDS58109+88 %
OpenDDS~90132+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.

Transportp50p90p99maxJitter (p99−p50)
TSN / AF_PACKET 0x88B511.9522.4929.5828117.62
UDP (gleicher Link)17.1021.0734.9092817.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.

ORBp50 (32 B)Cross-ORB-Interop
ZeroDDS16.3schnellster ORB im Vergleich
omniORB17.9
TAO36.7
JacORB57.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):

PayloadVec (copy)Arc (zero-copy)Δ
64 B390 ns390 ns±0 %
1 KB525 ns489 ns−6.9 %
4 KB959 ns974 ns+1.6 %
16 KB3.18 µs3.09 µs−2.8 %
64 KB11.49 µs11.04 µs−3.9 %

Methodik — wie gemessen wird

Offene Punkte & Grenzen (ehrlich)

Reproduzierbarkeit

Alle Messungen sind reproduzierbar dokumentiert. Wenn du die Zahlen in deiner Umgebung nicht reproduzierst, ist das ein Issue wert. Roh-Daten und Skripte:


Weiter: Features · Hard Truths · Kontakt