<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Performance on Mulham Fetna</title>
    <link>https://mulhamfetna.com/tags/performance/</link>
    <description>Recent content in Performance on Mulham Fetna</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>contact@mulhamfetna.com (Mulham Fetna)</managingEditor>
    <webMaster>contact@mulhamfetna.com (Mulham Fetna)</webMaster>
    <copyright>© 2026 Mulham Fetna</copyright>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mulhamfetna.com/tags/performance/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>What limits the frame rate: MediaPipe, Docker and a MuJoCo viewer on one laptop</title>
      <link>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/latency-benchmark/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/latency-benchmark/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  The single-script version felt smoother than the containers. The obvious suspect was Docker. The&#xA;measurements say otherwise — and point at something more interesting: two programs sharing one&#xA;integrated GPU.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Setup&#xA;    &lt;div id=&#34;setup&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#setup&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Laptop with an Intel Comet Lake CPU (12 threads) and Intel UHD Graphics; Linux on Wayland with&#xA;XWayland; USB webcam at 640×480, 30 fps, YUYV. Each row: mean of 150 frames after a 10-frame warm-up,&#xA;no hand in view. Measured 2026-09-16.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The result&#xA;    &lt;div id=&#34;the-result&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-result&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;chart&#34;&gt;&#xA;  &lt;canvas id=&#34;chart-f3b6ad3cd76a079ab08a776ccfdc0f69&#34;&gt;&lt;/canvas&gt;&#xA;  &lt;script type=&#34;text/javascript&#34;&gt;&#xA;    window.addEventListener(&#34;DOMContentLoaded&#34;, (event) =&gt; {&#xA;      const ctx = document.getElementById(&#34;chart-f3b6ad3cd76a079ab08a776ccfdc0f69&#34;);&#xA;      const chart = new Chart(ctx, {&#xA;        &#xA;type: &#39;bar&#39;,&#xA;data: {&#xA;  labels: [&#39;Vision alone (container)&#39;, &#39;Vision alone (host venv)&#39;, &#39;+ 1-core CPU burner&#39;, &#39;+ MuJoCo viewer (host, no Docker)&#39;, &#39;+ mujoco_twin (loop capped 30 Hz)&#39;, &#39;+ mujoco_twin (as shipped)&#39;],&#xA;  datasets: [{&#xA;    label: &#39;MediaPipe time per frame (ms)&#39;,&#xA;    data: [19.0, 19.2, 23.5, 54.9, 63.7, 85.6],&#xA;    backgroundColor: [&#39;rgba(42,120,214,0.75)&#39;,&#39;rgba(42,120,214,0.75)&#39;,&#39;rgba(42,120,214,0.75)&#39;,&#39;rgba(235,104,52,0.75)&#39;,&#39;rgba(235,104,52,0.75)&#39;,&#39;rgba(235,104,52,0.75)&#39;]&#xA;  }]&#xA;},&#xA;options: {&#xA;  indexAxis: &#39;y&#39;,&#xA;  plugins: { legend: { display: false }, title: { display: true, text: &#39;MediaPipe inference time by what else is running (30 fps budget = 33 ms)&#39; } },&#xA;  scales: { x: { min: 0, max: 100, title: { display: true, text: &#39;ms per frame&#39; } } }&#xA;}&#xA;&#xA;      });&#xA;    });&#xA;  &lt;/script&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Condition&lt;/th&gt;&#xA;          &lt;th&gt;Camera read&lt;/th&gt;&#xA;          &lt;th&gt;MediaPipe&lt;/th&gt;&#xA;          &lt;th&gt;&lt;code&gt;imshow&lt;/code&gt;&lt;/th&gt;&#xA;          &lt;th&gt;Loop&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Vision alone, &lt;strong&gt;container&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;10.0 ms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;19.0 ms&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;4.5 ms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;29.8 Hz&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Vision alone, &lt;strong&gt;host venv&lt;/strong&gt; (MediaPipe 0.10.11)&lt;/td&gt;&#xA;          &lt;td&gt;10.6 ms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;19.2 ms&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;3.9 ms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;29.7 Hz&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Container vision + &lt;strong&gt;1-core CPU burner&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;8.2 ms&lt;/td&gt;&#xA;          &lt;td&gt;23.5 ms&lt;/td&gt;&#xA;          &lt;td&gt;3.9 ms&lt;/td&gt;&#xA;          &lt;td&gt;28.1 Hz&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Host vision + &lt;strong&gt;plain MuJoCo viewer on host&lt;/strong&gt; (no Docker, no ROS)&lt;/td&gt;&#xA;          &lt;td&gt;1.6 ms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;54.9 ms&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;5.9 ms&lt;/td&gt;&#xA;          &lt;td&gt;16.0 Hz&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Container vision + &lt;strong&gt;&lt;code&gt;mujoco_twin&lt;/code&gt; capped at 30 Hz&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;1.7 ms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;63.7 ms&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;8.1 ms&lt;/td&gt;&#xA;          &lt;td&gt;13.6 Hz&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Container vision + &lt;strong&gt;&lt;code&gt;mujoco_twin&lt;/code&gt; as shipped&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;1.9 ms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;85.6 ms&lt;/strong&gt;&lt;/td&gt;&#xA;          &lt;td&gt;10.2 ms&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;10.2 Hz&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;End to end, &lt;code&gt;ros2 topic hz /hand/target_flexions&lt;/code&gt; read &lt;strong&gt;30.0 Hz&lt;/strong&gt; with only &lt;code&gt;vision_tracker&lt;/code&gt; running and&#xA;&lt;strong&gt;10.7 Hz&lt;/strong&gt; once &lt;code&gt;mujoco_twin&lt;/code&gt; started.&lt;/p&gt;</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/latency-benchmark/cover.png" />
    </item>
    
  </channel>
</rss>
