[{"data":1,"prerenderedAt":42},["ShallowReactive",2],{"note-hosting-paths-compared-en":3},{"slug":4,"order":5,"title":6,"summary":7,"measured":8,"topic":9,"toc":10,"html":41},"hosting-paths-compared",140,"\"Hosting paths compared: mod-host, omx-clap-host, the LV2 adapter and in-process\"","The same plugins cost the same per plugin on every hosting path, within about a microsecond, and no path adds latency. The differences in the whole graph come from CPU idle states and the number of nodes, not from how a host runs a plugin; what separates the paths is memory, start-up and what a crash takes with it.","An Intel Core Ultra 9 285K build machine shared with other jobs, Fedora 44, kernel 7.2, PipeWire 1.6.9 on its dummy driver, 48 and 96 kHz at 64 to 512 frames, three runs of 60 s, October 2026; omx-plugins 0.7.0 and stock LV2 and CLAP plugins.","core",[11,14,17,20,23,26,29,32,35,38],{"id":12,"title":13},"the-paths","The paths",{"id":15,"title":16},"what-was-measured","What was measured",{"id":18,"title":19},"the-whole-graph","The whole graph",{"id":21,"title":22},"per-plugin","Per plugin",{"id":24,"title":25},"start-up-and-memory","Start-up and memory",{"id":27,"title":28},"a-crash","A crash",{"id":30,"title":31},"what-the-numbers-say","What the numbers say",{"id":33,"title":34},"what-the-whole-graph-figure-measures","What the whole-graph figure measures",{"id":36,"title":37},"limits","Limits",{"id":39,"title":40},"what-followed","What followed","\u003Ch2 id=\"the-paths\">The paths\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>path\u003C\u002Fth>\n\u003Cth>what runs the plugin\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>mod-host\u003C\u002Ftd>\n\u003Ctd>mod-host 0.10.6 (the distribution's package), the LV2 build, one JACK client per plugin\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>omx-clap-host\u003C\u002Ftd>\n\u003Ctd>the CLAP build, one JACK client per plugin\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>the adapter\u003C\u002Ftd>\n\u003Ctd>the same omx-clap-host, the LV2 build through libomx-clap-lv2\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>in-process CLAP\u003C\u002Ftd>\n\u003Ctd>the CLAP build in a native PipeWire filter's process callback, through libomx-clap-core\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>in-process LV2\u003C\u002Ftd>\n\u003Ctd>the LV2 build the same way, opened through libomx-clap-lv2\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>At the time, omx-clap-host could not load an LV2 plugin by itself, so the adapter path loaded the LV2 plugins through a\nbench-only \u003Ccode>.clap\u003C\u002Fcode> that links libomx-clap-lv2: it measures the adapter's code inside an unmodified omx-clap-host. The\nin-process paths make the calls the console's in-process tier makes (open, activate, publish, run on the PipeWire data\nthread, with the core's clamp, non-finite scan and warm-up on), but give each plugin a filter node of its own, where the\nconsole runs a lane's plugins inline in its own node. Two figures are reported for them: the node's time, comparable with the\nother paths' nodes, and the inline time, the run call alone, which is what a plugin adds to a console's cycle.\u003C\u002Fp>\n\u003Cp>The plugins: omx-plugins comp, delay, deesser, eq8 and reverb in both builds; an LSP stereo compressor and Dragonfly Room as\nCLAP; ZamCompX2, caps PlateX2 and caps CompressX2 as LV2. So the CLAP paths run seven plugins and the LV2 paths eight, and\nthe comparison across formats is the five omx twins. Every plugin of a path is racked in one host, each fed the same stereo\nwhite noise at -20 dBFS and recorded; a pad carries a unit impulse four times a second, against a direct link carrying the\nsame impulse.\u003C\u002Fp>\n\u003Ch2 id=\"what-was-measured\">What was measured\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Node time per cycle\u003C\u002Fstrong>: pw-profiler's active to finished for each plugin's node, every cycle of the window: the plugin\nplus what its host does around it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Inline time\u003C\u002Fstrong> (in-process only): the run call timed on the data thread.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Cycle end\u003C\u002Fstrong>: the driver's time from wake-up to the last node finished.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Overruns\u003C\u002Fstrong>: cycles whose end passed their period; \u003Cstrong>late\u003C\u002Fstrong>: probe cycles more than 1.5 periods after the one before.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Added latency\u003C\u002Fstrong>: the impulse through the pad against the direct link, in frames.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Memory\u003C\u002Fstrong>: the host's resident set, empty and with every plugin racked.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Start-up\u003C\u002Fstrong>: host spawn to ready; \u003Ccode>add\u003C\u002Fcode> to its answer; \u003Ccode>add\u003C\u002Fcode> to the first sound at the recorder.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Crash\u003C\u002Fstrong>: the host killed while it runs a plugin, then respawned; and on the CLAP paths, a test plugin made to abort\nbeside a healthy one in the same host.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"the-whole-graph\">The whole graph\u003C\u002Fh2>\n\u003Cp>Median of three 60 s runs. mod-host, the adapter and in-process LV2 run the same eight plugins; omx-clap-host and in-process\nCLAP the same seven.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>rate\u003C\u002Fth>\n\u003Cth>quantum\u003C\u002Fth>\n\u003Cth>path\u003C\u002Fth>\n\u003Cth>plugins\u003C\u002Fth>\n\u003Cth>cycle end p50 µs\u003C\u002Fth>\n\u003Cth>cycle end p99 µs\u003C\u002Fth>\n\u003Cth>overruns\u003C\u002Fth>\n\u003Cth>host CPU %\u003C\u002Fth>\n\u003Cth>RSS MiB\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>48000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>mod-host\u003C\u002Ftd>\n\u003Ctd>8\u003C\u002Ftd>\n\u003Ctd>250.2\u003C\u002Ftd>\n\u003Ctd>719.4\u003C\u002Ftd>\n\u003Ctd>3\u003C\u002Ftd>\n\u003Ctd>8.2\u003C\u002Ftd>\n\u003Ctd>40.0\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>48000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>omx-clap-host\u003C\u002Ftd>\n\u003Ctd>7\u003C\u002Ftd>\n\u003Ctd>287.5\u003C\u002Ftd>\n\u003Ctd>759.9\u003C\u002Ftd>\n\u003Ctd>5\u003C\u002Ftd>\n\u003Ctd>9.1\u003C\u002Ftd>\n\u003Ctd>40.1\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>48000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>adapter\u003C\u002Ftd>\n\u003Ctd>8\u003C\u002Ftd>\n\u003Ctd>293.3\u003C\u002Ftd>\n\u003Ctd>772.7\u003C\u002Ftd>\n\u003Ctd>3\u003C\u002Ftd>\n\u003Ctd>10.0\u003C\u002Ftd>\n\u003Ctd>26.5\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>48000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>in-process CLAP\u003C\u002Ftd>\n\u003Ctd>7\u003C\u002Ftd>\n\u003Ctd>337.5\u003C\u002Ftd>\n\u003Ctd>788.5\u003C\u002Ftd>\n\u003Ctd>2\u003C\u002Ftd>\n\u003Ctd>8.5\u003C\u002Ftd>\n\u003Ctd>38.3\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>48000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>in-process LV2\u003C\u002Ftd>\n\u003Ctd>8\u003C\u002Ftd>\n\u003Ctd>265.5\u003C\u002Ftd>\n\u003Ctd>692.5\u003C\u002Ftd>\n\u003Ctd>4\u003C\u002Ftd>\n\u003Ctd>7.9\u003C\u002Ftd>\n\u003Ctd>22.8\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>96000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>mod-host\u003C\u002Ftd>\n\u003Ctd>8\u003C\u002Ftd>\n\u003Ctd>275.4\u003C\u002Ftd>\n\u003Ctd>748.1\u003C\u002Ftd>\n\u003Ctd>20\u003C\u002Ftd>\n\u003Ctd>23.7\u003C\u002Ftd>\n\u003Ctd>40.4\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>96000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>omx-clap-host\u003C\u002Ftd>\n\u003Ctd>7\u003C\u002Ftd>\n\u003Ctd>447.0\u003C\u002Ftd>\n\u003Ctd>926.9\u003C\u002Ftd>\n\u003Ctd>230\u003C\u002Ftd>\n\u003Ctd>32.4\u003C\u002Ftd>\n\u003Ctd>40.3\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>96000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>adapter\u003C\u002Ftd>\n\u003Ctd>8\u003C\u002Ftd>\n\u003Ctd>403.0\u003C\u002Ftd>\n\u003Ctd>844.6\u003C\u002Ftd>\n\u003Ctd>17\u003C\u002Ftd>\n\u003Ctd>31.4\u003C\u002Ftd>\n\u003Ctd>26.7\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>96000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>in-process CLAP\u003C\u002Ftd>\n\u003Ctd>7\u003C\u002Ftd>\n\u003Ctd>446.2\u003C\u002Ftd>\n\u003Ctd>915.4\u003C\u002Ftd>\n\u003Ctd>109\u003C\u002Ftd>\n\u003Ctd>35.4\u003C\u002Ftd>\n\u003Ctd>38.8\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>96000\u003C\u002Ftd>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>in-process LV2\u003C\u002Ftd>\n\u003Ctd>8\u003C\u002Ftd>\n\u003Ctd>436.9\u003C\u002Ftd>\n\u003Ctd>863.4\u003C\u002Ftd>\n\u003Ctd>18\u003C\u002Ftd>\n\u003Ctd>33.5\u003C\u002Ftd>\n\u003Ctd>22.9\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>At 96 kHz and 64 frames every path overran on this machine with these sets (98 for mod-host, 310 to 332 for the adapter and\nin-process LV2); the CLAP set's overruns at 96 kHz and 128 frames follow the reverb's maxima, 1.3 to 1.5 ms against a period\nof 1.33 ms.\u003C\u002Fp>\n\u003Ch2 id=\"per-plugin\">Per plugin\u003C\u002Fh2>\n\u003Cp>The node's own time per cycle, p50 \u002F p99 \u002F max, µs, 48 kHz and 128 frames; for in-process, the inline time:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>plugin\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003Cth>omx-clap-host\u003C\u002Fth>\n\u003Cth>adapter\u003C\u002Fth>\n\u003Cth>in-process CLAP inline\u003C\u002Fth>\n\u003Cth>in-process LV2 inline\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>omx-comp\u003C\u002Ftd>\n\u003Ctd>3.6 \u002F 19.5 \u002F 46\u003C\u002Ftd>\n\u003Ctd>4.3 \u002F 29.3 \u002F 63\u003C\u002Ftd>\n\u003Ctd>5.1 \u002F 17.9 \u002F 52\u003C\u002Ftd>\n\u003Ctd>3.5 \u002F 15.7 \u002F 44\u003C\u002Ftd>\n\u003Ctd>4.2 \u002F 16.9 \u002F 59\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>omx-delay\u003C\u002Ftd>\n\u003Ctd>2.1 \u002F 9.2 \u002F 25\u003C\u002Ftd>\n\u003Ctd>2.1 \u002F 10.8 \u002F 44\u003C\u002Ftd>\n\u003Ctd>2.9 \u002F 13.6 \u002F 37\u003C\u002Ftd>\n\u003Ctd>2.0 \u002F 9.3 \u002F 52\u003C\u002Ftd>\n\u003Ctd>2.5 \u002F 10.4 \u002F 49\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>omx-deesser\u003C\u002Ftd>\n\u003Ctd>4.5 \u002F 22.9 \u002F 53\u003C\u002Ftd>\n\u003Ctd>4.5 \u002F 25.9 \u002F 54\u003C\u002Ftd>\n\u003Ctd>5.1 \u002F 29.5 \u002F 59\u003C\u002Ftd>\n\u003Ctd>4.5 \u002F 22.6 \u002F 46\u003C\u002Ftd>\n\u003Ctd>5.0 \u002F 20.9 \u002F 51\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>omx-eq8\u003C\u002Ftd>\n\u003Ctd>2.1 \u002F 10.1 \u002F 23\u003C\u002Ftd>\n\u003Ctd>1.9 \u002F 8.8 \u002F 34\u003C\u002Ftd>\n\u003Ctd>2.6 \u002F 12.1 \u002F 38\u003C\u002Ftd>\n\u003Ctd>1.8 \u002F 8.1 \u002F 24\u003C\u002Ftd>\n\u003Ctd>2.2 \u002F 9.9 \u002F 23\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>omx-reverb\u003C\u002Ftd>\n\u003Ctd>5.7 \u002F 28.9 \u002F 59\u003C\u002Ftd>\n\u003Ctd>5.9 \u002F 24.4 \u002F 55\u003C\u002Ftd>\n\u003Ctd>6.7 \u002F 32.6 \u002F 67\u003C\u002Ftd>\n\u003Ctd>5.5 \u002F 23.6 \u002F 69\u003C\u002Ftd>\n\u003Ctd>6.5 \u002F 23.9 \u002F 68\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>ZamCompX2\u003C\u002Ftd>\n\u003Ctd>3.9 \u002F 20.2 \u002F 46\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>4.4 \u002F 22.2 \u002F 56\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>3.9 \u002F 17.1 \u002F 46\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>caps PlateX2\u003C\u002Ftd>\n\u003Ctd>5.7 \u002F 29.1 \u002F 61\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>6.3 \u002F 26.6 \u002F 93\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>5.8 \u002F 23.4 \u002F 68\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>caps CompressX2\u003C\u002Ftd>\n\u003Ctd>9.8 \u002F 57.3 \u002F 118\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>10.3 \u002F 58.0 \u002F 119\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>9.9 \u002F 54.8 \u002F 115\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>LSP compressor\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>6.6 \u002F 28.5 \u002F 67\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>6.5 \u002F 25.8 \u002F 71\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Dragonfly Room\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>28.4 \u002F 140.0 \u002F 1462\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>27.9 \u002F 128.4 \u002F 1448\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"start-up-and-memory\">Start-up and memory\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>path\u003C\u002Fth>\n\u003Cth>node p50 µs (all plugins and configurations)\u003C\u002Fth>\n\u003Cth>inline p50 µs\u003C\u002Fth>\n\u003Cth>\u003Ccode>add\u003C\u002Fcode> ms\u003C\u002Fth>\n\u003Cth>\u003Ccode>add\u003C\u002Fcode> to first sound ms\u003C\u002Fth>\n\u003Cth>host ready ms\u003C\u002Fth>\n\u003Cth>RSS empty MiB\u003C\u002Fth>\n\u003Cth>RSS per plugin MiB\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>mod-host\u003C\u002Ftd>\n\u003Ctd>7.3\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>4.2\u003C\u002Ftd>\n\u003Ctd>68.6\u003C\u002Ftd>\n\u003Ctd>24.4\u003C\u002Ftd>\n\u003Ctd>19.4\u003C\u002Ftd>\n\u003Ctd>2.31\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>omx-clap-host\u003C\u002Ftd>\n\u003Ctd>8.3\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>4.5\u003C\u002Ftd>\n\u003Ctd>68.2\u003C\u002Ftd>\n\u003Ctd>13.5\u003C\u002Ftd>\n\u003Ctd>5.8\u003C\u002Ftd>\n\u003Ctd>4.30\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>adapter\u003C\u002Ftd>\n\u003Ctd>7.5\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>3.7\u003C\u002Ftd>\n\u003Ctd>67.2\u003C\u002Ftd>\n\u003Ctd>13.7\u003C\u002Ftd>\n\u003Ctd>5.8\u003C\u002Ftd>\n\u003Ctd>2.31\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>in-process CLAP\u003C\u002Ftd>\n\u003Ctd>13.5\u003C\u002Ftd>\n\u003Ctd>8.3\u003C\u002Ftd>\n\u003Ctd>13.2\u003C\u002Ftd>\n\u003Ctd>75.9\u003C\u002Ftd>\n\u003Ctd>2.6\u003C\u002Ftd>\n\u003Ctd>3.3\u003C\u002Ftd>\n\u003Ctd>4.41\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>in-process LV2\u003C\u002Ftd>\n\u003Ctd>13.1\u003C\u002Ftd>\n\u003Ctd>8.4\u003C\u002Ftd>\n\u003Ctd>12.6\u003C\u002Ftd>\n\u003Ctd>74.9\u003C\u002Ftd>\n\u003Ctd>2.5\u003C\u002Ftd>\n\u003Ctd>3.3\u003C\u002Ftd>\n\u003Ctd>2.17\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"a-crash\">A crash\u003C\u002Fh2>\n\u003Cp>At 48 kHz and 128 frames, three times per path: a SIGKILL of the host silences its plugins within 1 to 3 ms, the graph keeps\ncycling (no late cycle; the probe's longest gap 3.0 to 4.4 ms against a 2.67 ms period), and a respawned host sounds again 70\nto 100 ms later. A plugin that aborts takes its host down 150 to 175 ms after the write that triggers it (the abort and its\ncore dump), and every other plugin in that host with it; the graph survived on both CLAP paths. In process, the host process\nis the console: the same crash there is the console's audio gone until the engine restarts.\u003C\u002Fp>\n\u003Ch2 id=\"what-the-numbers-say\">What the numbers say\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>A plugin costs the same on every path.\u003C\u002Fstrong> For the same plugin at the same rate and quantum, the node's median on mod-host,\nomx-clap-host and the adapter lie within about 1 µs of each other and of the in-process inline time (omx-eq8: 2.1, 1.9, 2.6\nand 1.8 to 2.2 µs; caps CompressX2: 9.8, 10.3 and 9.9 µs). The tails move by tens of microseconds between repetitions of\none configuration: that is the machine, not the path.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>The bench's in-process node costs 2 to 5 µs more than the other nodes\u003C\u002Fstrong>, while its inline time matches them: the price\nof the bench's own filter per plugin (four port buffers, two copies) on top of the core's stage. A console running the\nplugin inline in its lane pays the inline figure and no node.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>No path adds latency.\u003C\u002Fstrong> The impulse through the pad arrived in the cycle it left on every path, rate and quantum, every\nimpulse of every run. A JACK client in a PipeWire graph is scheduled synchronously in the cycle, so a mod-host plugin costs\nno extra quantum.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Memory\u003C\u002Fstrong>: on the same eight plugins, 40 MiB resident for mod-host (19 MiB before any plugin: it loads the whole LV2\nworld), 26.5 MiB for omx-clap-host with the adapter, 22.8 MiB in process. About 2.2 to 2.3 MiB per LV2 plugin on all three.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Start-up\u003C\u002Fstrong>: a host is ready in 2.5 ms in process, 13.5 ms for omx-clap-host, 24 ms for mod-host.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"what-the-whole-graph-figure-measures\">What the whole-graph figure measures\u003C\u002Fh2>\n\u003Cp>On the same eight LV2 plugins mod-host had the lowest cycle end in every configuration, while its nodes cost the same as the\nothers'. The same harness at 96 kHz and 128 frames, with \u003Ccode>\u002Fdev\u002Fcpu_dma_latency\u003C\u002Fcode> held to refuse CPU idle states, shows why.\nCycle end p50, µs, one to three runs each:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>idle states\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003Cth>adapter\u003C\u002Fth>\n\u003Cth>in-process LV2\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>all allowed (C1, C2, C3)\u003C\u002Ftd>\n\u003Ctd>265, 279\u003C\u002Ftd>\n\u003Ctd>380, 400, 412\u003C\u002Ftd>\n\u003Ctd>413\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cpu_dma_latency\u003C\u002Fcode> 1000 µs: C3 refused\u003C\u002Ftd>\n\u003Ctd>243, 244\u003C\u002Ftd>\n\u003Ctd>273, 333\u003C\u002Ftd>\n\u003Ctd>248, 322\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cpu_dma_latency\u003C\u002Fcode> 10 µs: C1 only\u003C\u002Ftd>\n\u003Ctd>80\u003C\u002Ftd>\n\u003Ctd>73\u003C\u002Ftd>\n\u003Ctd>95\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cpu_dma_latency\u003C\u002Fcode> 0: none\u003C\u002Ftd>\n\u003Ctd>26, 30\u003C\u002Ftd>\n\u003Ctd>23, 31\u003C\u002Ftd>\n\u003Ctd>24, 25\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cul>\n\u003Cli>\u003Cstrong>Most of the whole-graph figure is the exit from idle states.\u003C\u002Fstrong> With idle states allowed, the probe's source wakes the\nnine plugin nodes about 10 µs apart for the first four or five, then the rest 60 to 130 µs later: their cores were in C2 or\ndeeper. With none allowed they wake about 1.1 µs apart, and the paths are equal.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>mod-host's lead is its two always-running clients.\u003C\u002Fstrong> Besides one client per plugin, mod-host runs its own \u003Ccode>mod-host\u003C\u002Fcode>\nclient and \u003Ccode>mod-monitor\u003C\u002Fcode>, which wake every cycle and keep more cores out of deep idle. Idle JACK clients added to the\nadapter path shorten its cycle the same way, and with six on every path the order goes away.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>So it is the number of nodes that costs, not the host. That is what led to running a chain in one JACK client (see \u003Ca href=\"\u002Fnotes\u002Fone-jack-client-for-a-chain\">One JACK\nclient for a chain\u003C\u002Fa>) and to the idle-state hold (see \u003Ca href=\"\u002Fnotes\u002Fcpu-idle-states-and-plugin-hosting\">CPU idle states and plugin\nhosting\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"limits\">Limits\u003C\u002Fh2>\n\u003Cp>The machine was a shared build machine under a load of about 3, with the \u003Ccode>powersave\u003C\u002Fcode> governor, no isolation and no pinning:\nthe tails and the whole-graph figures carry its noise. The graph ran on PipeWire's dummy driver in a container; a real driver\nwakes differently. The plugins were fed white noise; a plugin whose cost depends on its input would read differently on\nprogramme material. Three stock LV2 plugins the adapter refused then, and one with a MIDI input, are not in the LV2 set.\u003C\u002Fp>\n\u003Ch2 id=\"what-followed\">What followed\u003C\u002Fh2>\n\u003Cp>On the plugins every path can host, the paths cost the same per plugin: the plugin's own \u003Ccode>process()\u003C\u002Fcode> dominates, and the\nhost's wrapper adds about a microsecond. In process costs the plugin's inline time and nothing else, but a crash there takes\nthe console's audio with it, where out of process the graph lives and a respawn sounds within 0.1 s. So plugin-hostd's\ndefault worker became omx-clap-host, out of process, for CLAP plugins and, through the adapter, for the LV2 plugins it\nadmits, with mod-host kept for the rest and in-process only for plugins qualification admits.\u003C\u002Fp>\n",1793954995908]