Skip to contentCerulion

Runtime performance

Speed, with
process isolation.

Change the payload. Compare the runtime and the process layout.

Native multi-process lane

PublisherWorker 01SubscriberWorker 02

One measured shared-memory crossing

Round-trip latency

Median · lower is faster

Payload size

Showing round-trip medians for a 64 B payload.

64 B payload: median round-trip latency by runtime configuration
Runtime configurationLogarithmic positionMedian latency
Cerulion nativeMulti-process · free run4.07 µsTwo workers
ROS 2Multi-process · defaults311.11 µsThree processes
Cerulion nativeSingle-process2.69 µsOne process
ROS 2Composed + intra-process24.64 µsOne process

Logarithmic scale. Each interval is 10× longer.

All measured values
Round-trip p50 in microseconds (µs)
Configuration64 B, selected payload1 MiB16 MiB
Cerulion nativeMulti-process · free run4.074.084.43
ROS 2Multi-process · defaults311.1110,951.63103,853.93
Cerulion nativeSingle-process2.692.762.8
ROS 2Composed + intra-process24.6429.7933.42

The measurement

Same campaign.
Different configurations.

One publisher/subscriber pair at a nominal 100 Hz. Median round-trip latency with payload fill excluded. Linux x86-64, September 16, 2026.

Cerulion multi-process
Two workers, one measured crossing. Free run enabled; lockstep is the shipped default.
ROS 2 defaults
Jazzy, rmw_fastrtps_cpp, plain publish and typed callback. Three processes, two crossings.
Single-process lanes
Cerulion single-process and ROS 2 composed. ROS 2 uses one executor with intra-process communication enabled.
Recording
Flashback enabled for both native Cerulion lanes. The ROS 2 lanes have no native recorder.
Tail latency and source record

Five runs × 2,000 samples per size. The chart shows the median of the five run medians. Native multi-process p99 is 6.61–10.45 µs across the three sizes, pooled over 10,000 samples per size.

24-core Intel Core Ultra 9 285K, performance governor, no RT tuning. The offered load allows requests to overlap when a round trip exceeds 10 ms.

One fixed100 campaign, two builds: a68a2a987 for native multi-process; 68a0d6196 for the other lanes. Read the public campaign summary

← Back to the story