[{"data":1,"prerenderedAt":36},["ShallowReactive",2],{"note-plugin-hostd-on-a-raspberry-pi-5-en":3},{"slug":4,"order":5,"title":6,"summary":7,"measured":8,"topic":9,"toc":10,"html":35},"plugin-hostd-on-a-raspberry-pi-5",80,"\"plugin-hostd on a Raspberry Pi 5: what was measured and how\"","On a Raspberry Pi 5 running Zynthian with an audio interface, a plugin-hostd chain has the lowest DSP load of the four hosts measured, omx-clap-host, mod-host and jalv being the others, at 48 and at 96 kHz, and uses about half the memory of mod-host. This note gives the device, the method and every table.","Raspberry Pi 5 (4 GB) with ZynthianOS Vangelis and an RME Babyface Pro, 5 November 2026; plugin-hostd 0.18.0 (protocol 0.3.0), omx-clap-host 0.29.0, omx-plugins 0.18.0, mod-host 0.10.9, jalv 1.6.9. Earlier runs, 2 November 2026; plugin-hostd 0.15.9, omx-clap-core 0.26.4, plugin-qualify 0.18.5, omx-plugins 0.17.0, Zynthian's stock mod-host.","zynthian",[11,14,17,20,23,26,29,32],{"id":12,"title":13},"the-device-and-the-method","The device and the method",{"id":15,"title":16},"48-khz","48 kHz",{"id":18,"title":19},"96-khz","96 kHz",{"id":21,"title":22},"under-load","Under load",{"id":24,"title":25},"the-floor-at-48-khz","The floor at 48 kHz",{"id":27,"title":28},"time-to-add","Time to add",{"id":30,"title":31},"from-the-earlier-runs","From the earlier runs",{"id":33,"title":34},"what-is-not-measured-yet","What is not measured yet","\u003Cp>The figures of these runs are also on the \u003Ca href=\"\u002Fbenchmarks\">benchmarks page\u003C\u002Fa>, row by row.\u003C\u002Fp>\n\u003Ch2 id=\"the-device-and-the-method\">The device and the method\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>A Raspberry Pi 5 (Cortex-A76, 4 cores, 4 GB) running ZynthianOS Vangelis (Debian 13, arm64), kernel 6.18 (not\nPREEMPT_RT), with the packages a Zynthian on the OpenMixer channel installs.\u003C\u002Fli>\n\u003Cli>JACK 1.9.22 on the ALSA driver of an RME Babyface Pro, at real-time priority 70, with the CPU governor at\n\u003Ccode>performance\u003C\u002Fcode> and Zynthian's own services stopped for the run and put back after it. DSP load and xruns are the JACK\nserver's: everything was read digitally, at the server and its ports, and nothing here is a claim about analog audio.\u003C\u002Fli>\n\u003Cli>Each row is the median of three repeats of 10 s, with the lowest and highest repeat on the benchmarks page. DSP is\nJACK's DSP load; PSS is the host processes' proportional memory, which shares the libraries out, so it is the memory\nthe device actually spends.\u003C\u002Fli>\n\u003Cli>The hosts were driven directly by the bench harness of plugin-hostd, not through Zynthian's engine or MOD-UI.\u003C\u002Fli>\n\u003Cli>A row whose repeats spread too wide in the shared run was run again alone, and the row run alone is the one given.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The hosts:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>host\u003C\u002Fth>\n\u003Cth>what runs\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>plugin-hostd, added into one chain\u003C\u002Ftd>\n\u003Ctd>the daemon and one worker for the whole chain, one JACK client\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>plugin-hostd, chain declared at once\u003C\u002Ftd>\n\u003Ctd>the same chain, started with the whole list\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>plugin-hostd, one worker per plugin\u003C\u002Ftd>\n\u003Ctd>the daemon and one worker per plugin, a JACK client each\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>omx-clap-host, one process\u003C\u002Ftd>\n\u003Ctd>one omx-clap-host process for every plugin\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>mod-host\u003C\u002Ftd>\n\u003Ctd>one mod-host process for every plugin, a JACK client each (LV2 builds)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>jalv\u003C\u002Ftd>\n\u003Ctd>one jalv process per plugin (LV2 builds)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The plugin sets: omx comp, delay and drive in turn, 3, 8 and 16 of them, in their CLAP builds where the host runs CLAP\nand their LV2 builds on mod-host and jalv; the same with Calf Compressor (LV2) in the turn, 8 and 16 of them; and one\nPianoteq 9 playing five-note chords.\u003C\u002Fp>\n\u003Ch2 id=\"48-khz\">48 kHz\u003C\u002Fh2>\n\u003Cp>16 plugins (omx comp, delay and drive), 3 periods, Zynthian's own setting. DSP load, xruns where a repeat had any, PSS:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>frames\u003C\u002Fth>\n\u003Cth>plugin-hostd, added into one chain\u003C\u002Fth>\n\u003Cth>omx-clap-host\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003Cth>plugin-hostd, one worker per plugin\u003C\u002Fth>\n\u003Cth>jalv\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>128\u003C\u002Ftd>\n\u003Ctd>6.75 %\u003C\u002Ftd>\n\u003Ctd>9.36 %\u003C\u002Ftd>\n\u003Ctd>8.86 %\u003C\u002Ftd>\n\u003Ctd>10.88 %\u003C\u002Ftd>\n\u003Ctd>11.40 %\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>256\u003C\u002Ftd>\n\u003Ctd>6.35 %\u003C\u002Ftd>\n\u003Ctd>7.75 %\u003C\u002Ftd>\n\u003Ctd>7.38 %\u003C\u002Ftd>\n\u003Ctd>8.63 %\u003C\u002Ftd>\n\u003Ctd>8.49 %\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>PSS\u003C\u002Ftd>\n\u003Ctd>54 to 55 MB\u003C\u002Ftd>\n\u003Ctd>53 MB\u003C\u002Ftd>\n\u003Ctd>99 MB\u003C\u002Ftd>\n\u003Ctd>143 MB\u003C\u002Ftd>\n\u003Ctd>690 MB\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The chain declared at once reads the same as the chain added into (6.75 and 6.38 %). With 3 plugins every host reads\n1.5 to 1.7 % at 256 frames: the difference shows from 8 plugins up, or at 128 frames.\u003C\u002Fp>\n\u003Cp>The set with Calf Compressor, 16 plugins, at each setting the bench ran (DSP load):\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>frames, periods\u003C\u002Fth>\n\u003Cth>plugin-hostd chain\u003C\u002Fth>\n\u003Cth>omx-clap-host\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003Cth>plugin-hostd, one worker per plugin\u003C\u002Fth>\n\u003Cth>jalv\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>128, 2\u003C\u002Ftd>\n\u003Ctd>6.83 %\u003C\u002Ftd>\n\u003Ctd>10.06 %\u003C\u002Ftd>\n\u003Ctd>9.40 %\u003C\u002Ftd>\n\u003Ctd>11.31 %\u003C\u002Ftd>\n\u003Ctd>12.97 %, 38 xruns\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>128, 3\u003C\u002Ftd>\n\u003Ctd>7.00 %\u003C\u002Ftd>\n\u003Ctd>9.65 %\u003C\u002Ftd>\n\u003Ctd>9.24 %\u003C\u002Ftd>\n\u003Ctd>11.80 %\u003C\u002Ftd>\n\u003Ctd>12.34 %, 32 xruns\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>256, 2\u003C\u002Ftd>\n\u003Ctd>6.46 %\u003C\u002Ftd>\n\u003Ctd>8.43 %\u003C\u002Ftd>\n\u003Ctd>8.21 %\u003C\u002Ftd>\n\u003Ctd>12.52 %\u003C\u002Ftd>\n\u003Ctd>9.44 %\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>256, 3\u003C\u002Ftd>\n\u003Ctd>7.79 %\u003C\u002Ftd>\n\u003Ctd>7.73 %\u003C\u002Ftd>\n\u003Ctd>7.66 %\u003C\u002Ftd>\n\u003Ctd>9.14 %\u003C\u002Ftd>\n\u003Ctd>8.80 %\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>At 128 frames the chain runs 16 plugins at 0.7 of omx-clap-host or mod-host and about half of jalv, and jalv is the only\nhost with xruns. At 256 frames with 3 periods every one-process form reads the same; the chain's figure there has the\nwidest spread of the table (7.47 to 8.16 %) and was not run again alone, so it is not read as a cost of the third period.\nomx-clap-host and mod-host are within 0.7 points of each other at every setting: the LV2 adapter is not the slower path.\u003C\u002Fp>\n\u003Cp>Pianoteq 9, one instance, at 256 frames and 3 periods: 13.60 % on omx-clap-host, 13.64 % on plugin-hostd, 13.40 % on\nmod-host and 14.70 % on jalv. The instrument's own threads do the work, so the host makes little difference; its PSS is\n250 MB on plugin-hostd, 288 MB on mod-host and 279 MB on jalv.\u003C\u002Fp>\n\u003Ch2 id=\"96-khz\">96 kHz\u003C\u002Fh2>\n\u003Cp>The same rows at 96000 Hz, 3 periods. At 96 kHz a 256-frame period is 2.67 ms and a 128-frame period 1.33 ms. DSP load,\nwith the median xruns where a repeat had any:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>set, frames\u003C\u002Fth>\n\u003Cth>plugin-hostd, added into one chain\u003C\u002Fth>\n\u003Cth>omx-clap-host\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003Cth>plugin-hostd, one worker per plugin\u003C\u002Fth>\n\u003Cth>jalv\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>16 omx plugins, 128\u003C\u002Ftd>\n\u003Ctd>15.46 %, 1 xrun\u003C\u002Ftd>\n\u003Ctd>18.18 %\u003C\u002Ftd>\n\u003Ctd>19.93 %, 9 xruns\u003C\u002Ftd>\n\u003Ctd>21.19 %, 26 xruns\u003C\u002Ftd>\n\u003Ctd>31.12 %, 183 xruns\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>16 omx plugins, 256\u003C\u002Ftd>\n\u003Ctd>12.66 %\u003C\u002Ftd>\n\u003Ctd>15.43 %\u003C\u002Ftd>\n\u003Ctd>14.60 %, 8 xruns\u003C\u002Ftd>\n\u003Ctd>16.85 %\u003C\u002Ftd>\n\u003Ctd>18.16 %, 52 xruns\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>16 with Calf, 128\u003C\u002Ftd>\n\u003Ctd>13.61 %, 8 xruns\u003C\u002Ftd>\n\u003Ctd>18.85 %, 4 xruns\u003C\u002Ftd>\n\u003Ctd>21.88 %, 43 xruns\u003C\u002Ftd>\n\u003Ctd>21.96 %\u003C\u002Ftd>\n\u003Ctd>23.61 %\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Pianoteq 9, 128\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>20.71 %, 7 xruns\u003C\u002Ftd>\n\u003Ctd>21.85 %, 4 xruns\u003C\u002Ftd>\n\u003Ctd>20.63 %, 3 xruns\u003C\u002Ftd>\n\u003Ctd>23.24 %, 10 xruns\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Pianoteq 9, 256\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>20.66 %, 3 xruns\u003C\u002Ftd>\n\u003Ctd>20.94 %, 1 xrun\u003C\u002Ftd>\n\u003Ctd>20.24 %, 5 xruns\u003C\u002Ftd>\n\u003Ctd>20.38 %, 3 xruns\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Pianoteq is one instrument, so it has no chain. The chain declared at once reads 13.2 % (16 omx plugins, 128) and 12.64 % (256).\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Twice the rate, about twice the load: the effects sets read 1.8 to 2.1 times their 48 kHz figure on every host.\nPianoteq costs 1.4 to 1.6 times, since part of its work does not grow with the rate.\u003C\u002Fli>\n\u003Cli>The order of the hosts does not change: the chain is the lowest at every size.\u003C\u002Fli>\n\u003Cli>Xruns come back at 96 kHz where 48 kHz had none. The chain holds at 0 to 8; jalv has the most.\u003C\u002Fli>\n\u003Cli>128 frames is not the floor at 96 kHz: with no plugin, omx-clap-host, plugin-hostd and mod-host ran it with no xrun\n(jalv has no host without a plugin).\u003C\u002Fli>\n\u003Cli>2 periods against 3 at 256 frames: the same for the effects sets, but Pianoteq and the 16 omx plugins read higher with\n2 on omx-clap-host and mod-host. At 96 kHz the third period is worth keeping, as Zynthian has it.\u003C\u002Fli>\n\u003Cli>Memory does not depend on the rate: each host's PSS is within 1 MB of its 48 kHz figure.\u003C\u002Fli>\n\u003Cli>Two rows failed because the JACK server did not answer within 10 s in one repeat: mod-host with 16 plugins (Calf set)\nat 256 frames and jalv with 8 omx plugins at 128. No host refused a plugin.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Some 96 kHz rows have a wide spread and are not read on their own: jalv with 16 omx plugins at 128 frames (22.96 to\n31.52 %), omx-clap-host with the Calf set at 256 frames, and three rows with 2 periods.\u003C\u002Fp>\n\u003Ch2 id=\"under-load\">Under load\u003C\u002Fh2>\n\u003Cp>The bench's load is one busy loop on each core the host may use plus 256 MiB of memory being touched. 16 plugins with\nCalf at 48 kHz, 256 frames, 3 periods: the chain read 6.68 to 6.76 %, the one-process hosts rose by up to 0.4 points\n(omx-clap-host 8.14 %, mod-host 7.87 %, jalv 8.82 %), and one worker per plugin, 17 processes, is the one that had xruns\n(10.13 %, 30). The same holds for 16 omx plugins at 128 frames: the chain 6.94 % under load against 6.75 % without, one worker per\nplugin 90 xruns. At 96 kHz every form has xruns under this load, the chain the fewest (1 to 9) with jalv (0, with 690 MB\nfor its 16 processes).\u003C\u002Fp>\n\u003Ch2 id=\"the-floor-at-48-khz\">The floor at 48 kHz\u003C\u002Fh2>\n\u003Cp>64 frames at 48 kHz has xruns on omx-clap-host, plugin-hostd and mod-host with no plugin loaded, at JACK priority 70 and\nat JACK's default 10: it is the device's floor, not a host's, and no row says a host is clean at 64. Priority 70 helps\nthe hosts that do the work in one process: mod-host with 16 plugins 12.0 % at priority 70 against 14.8 % at 10.\u003C\u002Fp>\n\u003Ch2 id=\"time-to-add\">Time to add\u003C\u002Fh2>\n\u003Cp>16 omx plugins at 48 kHz and 128 frames, the host running, every plugin added until the last one runs:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>plugin-hostd, added into one chain\u003C\u002Fth>\n\u003Cth>plugin-hostd, chain declared at once\u003C\u002Fth>\n\u003Cth>omx-clap-host\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003Cth>plugin-hostd, one worker per plugin\u003C\u002Fth>\n\u003Cth>jalv\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>80 ms\u003C\u002Ftd>\n\u003Ctd>2.034 s\u003C\u002Ftd>\n\u003Ctd>397 ms\u003C\u002Ftd>\n\u003Ctd>364 ms\u003C\u002Ftd>\n\u003Ctd>640 ms\u003C\u002Ftd>\n\u003Ctd>13.8 s\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Adding into a running chain is the fast path. A chain declared at once starts the worker with the whole list, which\ntakes longer; jalv starts a process and a JACK client per plugin.\u003C\u002Fp>\n\u003Ch2 id=\"from-the-earlier-runs\">From the earlier runs\u003C\u002Fh2>\n\u003Cp>These sections come from runs on plugin-hostd 0.15.9 and omx-clap-core 0.26.4 on JACK's dummy driver at 48000 Hz and\n256 frames, against Zynthian's own mod-host build, unless a section names other versions. They have not been repeated\non the audio interface yet.\njalv is named where it was measured; the earlier mod-host and omx-clap-host tables did not include it.\u003C\u002Fp>\n\u003Ch3 id=\"time-to-add-cold-and-warm\">Time to add, cold and warm\u003C\u002Fh3>\n\u003Cp>Cold: the host started, then every plugin of the set added, until the last one runs; the median of three. mod-host scans\nthe whole LV2 world (1336 plugins on this device) before it answers, and that start, 800 to 945 ms, is part of its time.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>set\u003C\u002Fth>\n\u003Cth>plugin-hostd, into a chain\u003C\u002Fth>\n\u003Cth>plugin-hostd, one worker each\u003C\u002Fth>\n\u003Cth>omx-clap-host\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>24 plugins, LV2 builds\u003C\u002Ftd>\n\u003Ctd>549 ms\u003C\u002Ftd>\n\u003Ctd>1976 ms\u003C\u002Ftd>\n\u003Ctd>948 ms\u003C\u002Ftd>\n\u003Ctd>1459 ms\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>24 plugins, CLAP builds (Calf LV2)\u003C\u002Ftd>\n\u003Ctd>440 ms\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd>848 ms\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>ten third-party LV2 plugins\u003C\u002Ftd>\n\u003Ctd>255 ms\u003C\u002Ftd>\n\u003Ctd>497 ms\u003C\u002Ftd>\n\u003Ctd>458 ms\u003C\u002Ftd>\n\u003Ctd>1044 ms\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Warm: chains of 2, 4 and 7 of omx comp, delay and drive, LV2 builds, the host already running.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>plugins\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003Cth>plugin-hostd, into a chain\u003C\u002Fth>\n\u003Cth>omx-clap-host\u003C\u002Fth>\n\u003Cth>plugin-hostd, one worker each\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>2\u003C\u002Ftd>\n\u003Ctd>44.8 ms\u003C\u002Ftd>\n\u003Ctd>55.9 ms\u003C\u002Ftd>\n\u003Ctd>72.4 ms\u003C\u002Ftd>\n\u003Ctd>79.5 ms\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>4\u003C\u002Ftd>\n\u003Ctd>98 ms\u003C\u002Ftd>\n\u003Ctd>73 ms\u003C\u002Ftd>\n\u003Ctd>137 ms\u003C\u002Ftd>\n\u003Ctd>154 ms\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>7\u003C\u002Ftd>\n\u003Ctd>189 ms\u003C\u002Ftd>\n\u003Ctd>96 ms\u003C\u002Ftd>\n\u003Ctd>234 ms\u003C\u002Ftd>\n\u003Ctd>272 ms\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>mod-host is the fastest to add two plugins to a running host; from four on, the chain is. A worker of its own costs about\n40 ms per plugin: the process and its JACK client.\u003C\u002Fp>\n\u003Ch3 id=\"instruments\">Instruments\u003C\u002Fh3>\n\u003Cp>One instance with 1, 8 and 16 notes held; DSP load and PSS:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>instrument\u003C\u002Fth>\n\u003Cth>plugin-hostd\u003C\u002Fth>\n\u003Cth>mod-host\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>mda Piano\u003C\u002Ftd>\n\u003Ctd>0.6 \u002F 2.0 \u002F 3.5 %, 29 MB\u003C\u002Ftd>\n\u003Ctd>0.6 \u002F 2.0 \u002F 3.5 %, 72 MB\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Odin 2\u003C\u002Ftd>\n\u003Ctd>3.6 \u002F 11.8 \u002F 21.3 %, 89 MB\u003C\u002Ftd>\n\u003Ctd>3.8 \u002F 11.7 \u002F 21.0 %, 132 MB\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Surge XT (CLAP on plugin-hostd, LV2 on mod-host)\u003C\u002Ftd>\n\u003Ctd>1.8 \u002F 4.2 \u002F 6.9 %, 68 MB\u003C\u002Ftd>\n\u003Ctd>2.0 \u002F 4.1 \u002F 6.9 %, 112 MB\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The same DSP load on both hosts, and 43 to 44 MB less memory on plugin-hostd. ZynAddSubFX and sfizz run as their own JACK\nprograms, as Zynthian runs them, through neither host: ZynAddSubFX with Analog Pad 1 at 0.6 \u002F 1.6 \u002F 2.6 %, 90 MB; sfizz with\nthe Salamander piano at 0.9 \u002F 2.9 \u002F 5.1 %, 86 to 119 MB. None of the five offers a thread pool. One plugin-hostd repeat of\nOdin 2 at one note had one xrun. How instruments use the cores is in \u003Ca href=\"\u002Fnotes\u002Finstruments-on-a-pi-5\">Instruments on a Pi 5\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"where-the-chain-s-time-goes\">Where the chain's time goes\u003C\u002Fh3>\n\u003Cp>perf on the worker's audio thread, 24 plugins in one chain, measured with builds carrying symbols: the plugins and libm take\n88 to 92 % of it. The host's own code takes about 4 to 7 %: the LV2 adapter's copies (1.9 % when every plugin is LV2), the\ncopies at the chain's input and output (about 1 %), the adapter's control and event work (about 1 % on LV2), and the guards\nof the stage with the clamp (about 0.5 %). The kernel and libjack take 0.5 %, where mod-host on the same chain spends 10 to\n14 % of its samples there, across its 24 JACK clients. The heaviest single symbol is \u003Ccode>tanhf\u003C\u002Fcode> in omx-drive, 14 to 15 %.\u003C\u002Fp>\n\u003Ch3 id=\"many-chains-at-once\">Many chains at once\u003C\u002Fh3>\n\u003Cp>An earlier stress run, on plugin-hostd 0.13.1 and the device's own JACK server at 48000 Hz and 256 frames, held chains of\nfour LV2 plugins at 1, 2, 4, 8 and 16 chains for 60 s each. At 16 chains the hosting processes used 70.6 % of a core\ngrouped (one worker per chain, 60 plugins), 100.8 % alone (one worker per plugin) and 82.3 % on jalv (64 plugins); PSS was\n224.2, 359.3 and 2745.6 MB. Grouped and alone reached 16 chains without a limit; jalv stopped there on memory, with 2\nxruns.\u003C\u002Fp>\n\u003Ch3 id=\"qualification-on-the-device-plugin-qualify-0-18-5\">Qualification on the device (plugin-qualify 0.18.5)\u003C\u002Fh3>\n\u003Cp>With the qualification records package omx-qualification-rpi5-zynthian-vangelis 2026110101: 1602 plugins (1341 LV2, 261 CLAP); 1079 qualified in-process\nand 306 isolated; 93 crashed, 46 hung and 13 refused; 27 unmeasured, each with its reason. Every package installs from the\nchannel and \u003Ccode>dpkg -V\u003C\u002Fcode> finds nothing changed; each of the five instruments above sounds under its notes.\u003C\u002Fp>\n\u003Ch2 id=\"what-is-not-measured-yet\">What is not measured yet\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Listening through the audio interface, and latency measured on audio per host: every figure above is read digitally.\u003C\u002Fli>\n\u003Cli>Instruments on the audio interface with plugin-hostd 0.18.0, and the thread-pool row: Surge XT declares no thread\npool, so that row can only show that nothing changes, and the bench tool did not reach its ports this time.\u003C\u002Fli>\n\u003Cli>The qualification on plugin-qualify 0.19.0, which replaces the counts above when it is done.\u003C\u002Fli>\n\u003Cli>The per-block cost of every plugin at Zynthian's own quantum (128 and 256 frames): the qualification probe times\n512-frame blocks only.\u003C\u002Fli>\n\u003Cli>The cost estimate a chain editor would ask the daemon for before an insert.\u003C\u002Fli>\n\u003C\u002Ful>\n",1793954995857]