How fast does a Cua Space start on a Mac?
On a Mac Studio (Apple M2 Max, 96 GB), a new headless Cua Space ran its first command 234.6 ms after create as a gVisor container, 341.1 ms as a microVM and 637.3 ms as a QEMU VM (p50, n = 30 each), measured 2026-10-25 on Cua Spaces 0.15.0.
Measured Build app 0.15.0, cua 0.9.0, cua-spacesd 0.8.0Raw data (CSV)
Results
Time from the create call until the Space answers its first command, one Space at a time. Lower is better.
- gVisor container
- microVM
- QEMU VM
| Result | Value | Fastest | p50 | p90 | p99 | Slowest | n | Measured |
|---|---|---|---|---|---|---|---|---|
| gVisor container | 234.6 ms p50 | 204.8 ms | 234.6 ms | 257.7 ms | 270.1 ms | 270.1 ms | 30 | 2026-10-25 |
| microVM | 341.1 ms p50 | 323.2 ms | 341.1 ms | 349 ms | 359.9 ms | 359.9 ms | 30 | 2026-10-25 |
| QEMU VM | 637.3 ms p50 | 576.9 ms | 637.3 ms | 657 ms | 674.7 ms | 674.7 ms | 30 | 2026-10-25 |
Method: gVisor container
Driver on the host: rollout_bench create (Rust SDK example built from the release tag) talks to this release's own cua daemon (isolated CUA_HOME). Workload: a gVisor container in the built-in Linux runtime VM (Lima on Virtualization.framework, default 4 vCPU / 32 GiB) Space created from ghcr.io/trycua/linux:24.04-slim with --kind container --runtime gvisor --cpus 1 --memory-mb 1024 --headless (only cua-spacesd in the guest, no desktop).
Each sample = SandboxCreateOptions create call start → the Space's cua-spacesd answers a first sh -c true with exit 0 (create + attach + first exec). n=30, serial (one at a time), each Space deleted after its sample. The warm pool is off (CUA_POOL_AUTO=off), so every sample is a real create. One warm-up create before the samples is excluded (image pull/unpack and the golden snapshot it records: 13014 ms).
Caveats
- Headless shape (only cua-spacesd); the full desktop image starts slower.
- Golden snapshots on (the default): the excluded first create records the snapshot that later creates restore.
- With CUA_GVISOR_WARM=0 (no golden snapshot), n = 10: p50 257.9 ms, p95 272.9 ms.
Environment and build
| Machine | Mac Studio, Mac14,13 (Mac Studio) |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 (25G83) |
| Where | local |
| Kind | gvisor |
| Image | ghcr.io/trycua/linux:24.04-slim |
| Shape | 1 vCPU, 1 GiB, --headless |
| Other vms | 2 |
| Network | n/a (local) |
| Settings | CUA_POOL_AUTO=off (no warm pool); golden snapshots at their default (on) |
| Build | Cua Spaces 0.15.0 DMG (https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg, sha256 8725a09ba4132aa8a1667fa48c86416c91d5dec0d3c7dc93f88f5f3e29e0aba0): bundled cua 0.9.0, Helpers/cua-spacesd 0.8.0, cua-vz |
| App | 0.15.0 |
| cua | 0.9.0 |
| cua_spacesd | 0.8.0 |
Reproduce
# On an Apple silicon Mac (macOS 26), with Rust (rustup) and git:
curl -fLO https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg
hdiutil attach -nobrowse -mountpoint /tmp/cua-dmg cua-spaces-0.15.0-darwin-universal.dmg
mkdir -p ~/bench && ditto "/tmp/cua-dmg/Cua Spaces.app" ~/bench/"Cua Spaces.app" && hdiutil detach /tmp/cua-dmg
git clone --depth 1 --branch cua-spaces-v0.15.0 https://github.com/trycua/cua ~/bench/cua
(cd ~/bench/cua/libs/cua && cargo build --locked --release -p cua-sdk --example rollout_bench --example channel_bench)
export PATH="$HOME/bench/Cua Spaces.app/Contents/MacOS:$PATH" CUA_HOME=~/bench/home DO_NOT_TRACK=1 CUA_TELEMETRY=0
RB=~/bench/cua/libs/cua/target/release/examples/rollout_bench
cua daemon start --foreground & # with CUA_POOL_AUTO=off in its environment
IMG=ghcr.io/trycua/linux:24.04-slim
$RB create --prefix warm- --n 1 --image $IMG --kind container --runtime gvisor --cpus 1 --memory-mb 1024 --headless # excluded warm-up
$RB create --prefix cold- --n 30 --conc 1 --image $IMG --kind container --runtime gvisor --cpus 1 --memory-mb 1024 --headless # one JSON line per sample (ready_ms)Method: microVM
Driver on the host: rollout_bench create (Rust SDK example built from the release tag) talks to this release's own cua daemon (isolated CUA_HOME). Workload: a microVM, runtime vz (cua-vz, Virtualization.framework, one VM per Space, guest kernel 6.1.155) Space created from ghcr.io/trycua/linux:24.04-slim with --kind microvm --cpus 1 --memory-mb 1024 --headless (only cua-spacesd in the guest, no desktop).
Each sample = SandboxCreateOptions create call start → the Space's cua-spacesd answers a first sh -c true with exit 0 (create + attach + first exec). n=30, serial (one at a time), each Space deleted after its sample. The warm pool is off (CUA_POOL_AUTO=off), so every sample is a real create. One warm-up create before the samples is excluded (image pull/unpack and the golden snapshot it records: 435 ms).
Caveats
- Headless shape (only cua-spacesd); the full desktop image starts slower.
- Golden snapshots on (the default): the excluded first create records the snapshot that later creates restore.
- A start without the golden snapshot was not measured.
Environment and build
| Machine | Mac Studio, Mac14,13 (Mac Studio) |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 (25G83) |
| Where | local |
| Kind | microvm |
| Image | ghcr.io/trycua/linux:24.04-slim |
| Shape | 1 vCPU, 1 GiB, --headless |
| Other vms | 2 |
| Network | n/a (local) |
| Settings | CUA_POOL_AUTO=off (no warm pool); golden snapshots at their default (on) |
| Build | Cua Spaces 0.15.0 DMG (https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg, sha256 8725a09ba4132aa8a1667fa48c86416c91d5dec0d3c7dc93f88f5f3e29e0aba0): bundled cua 0.9.0, Helpers/cua-spacesd 0.8.0, cua-vz |
| App | 0.15.0 |
| cua | 0.9.0 |
| cua_spacesd | 0.8.0 |
Reproduce
# On an Apple silicon Mac (macOS 26), with Rust (rustup) and git:
curl -fLO https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg
hdiutil attach -nobrowse -mountpoint /tmp/cua-dmg cua-spaces-0.15.0-darwin-universal.dmg
mkdir -p ~/bench && ditto "/tmp/cua-dmg/Cua Spaces.app" ~/bench/"Cua Spaces.app" && hdiutil detach /tmp/cua-dmg
git clone --depth 1 --branch cua-spaces-v0.15.0 https://github.com/trycua/cua ~/bench/cua
(cd ~/bench/cua/libs/cua && cargo build --locked --release -p cua-sdk --example rollout_bench --example channel_bench)
export PATH="$HOME/bench/Cua Spaces.app/Contents/MacOS:$PATH" CUA_HOME=~/bench/home DO_NOT_TRACK=1 CUA_TELEMETRY=0
RB=~/bench/cua/libs/cua/target/release/examples/rollout_bench
cua daemon start --foreground & # with CUA_POOL_AUTO=off in its environment
IMG=ghcr.io/trycua/linux:24.04-slim
$RB create --prefix warm- --n 1 --image $IMG --kind microvm --cpus 1 --memory-mb 1024 --headless # excluded warm-up
$RB create --prefix cold- --n 30 --conc 1 --image $IMG --kind microvm --cpus 1 --memory-mb 1024 --headless # one JSON line per sample (ready_ms)Method: QEMU VM
Driver on the host: rollout_bench create (Rust SDK example built from the release tag) talks to this release's own cua daemon (isolated CUA_HOME). Workload: a full Linux VM, runtime qemu (QEMU 10.2.2 on HVF, Homebrew build found by the runtime check), image resolves to linux:24.04-slim-disk Space created from ghcr.io/trycua/linux:24.04-slim with --kind vm --cpus 1 --memory-mb 1024 --headless (only cua-spacesd in the guest, no desktop).
Each sample = SandboxCreateOptions create call start → the Space's cua-spacesd answers a first sh -c true with exit 0 (create + attach + first exec). n=30, serial (one at a time), each Space deleted after its sample. The warm pool is off (CUA_POOL_AUTO=off), so every sample is a real create. One warm-up create before the samples is excluded (image pull/unpack and the golden snapshot it records: 1699 ms).
Caveats
- Headless shape (only cua-spacesd); the full desktop image starts slower.
- Golden snapshots on (the default): the excluded first create records the snapshot that later creates restore.
- A start without the golden snapshot is not published.
Environment and build
| Machine | Mac Studio, Mac14,13 (Mac Studio) |
|---|---|
| Chip | Apple M2 Max, 12 cores |
| Memory | 96 GB |
| OS | macOS 26.6.2 (25G83) |
| Where | local |
| Kind | vm |
| Image | ghcr.io/trycua/linux:24.04-slim |
| Shape | 1 vCPU, 1 GiB, --headless |
| Other vms | 2 |
| Network | n/a (local) |
| Settings | CUA_POOL_AUTO=off (no warm pool); golden snapshots at their default (on) |
| Build | Cua Spaces 0.15.0 DMG (https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg, sha256 8725a09ba4132aa8a1667fa48c86416c91d5dec0d3c7dc93f88f5f3e29e0aba0): bundled cua 0.9.0, Helpers/cua-spacesd 0.8.0, cua-vz |
| App | 0.15.0 |
| cua | 0.9.0 |
| cua_spacesd | 0.8.0 |
Reproduce
# On an Apple silicon Mac (macOS 26), with Rust (rustup) and git:
curl -fLO https://github.com/trycua/cua/releases/download/cua-spaces-v0.15.0/cua-spaces-0.15.0-darwin-universal.dmg
hdiutil attach -nobrowse -mountpoint /tmp/cua-dmg cua-spaces-0.15.0-darwin-universal.dmg
mkdir -p ~/bench && ditto "/tmp/cua-dmg/Cua Spaces.app" ~/bench/"Cua Spaces.app" && hdiutil detach /tmp/cua-dmg
git clone --depth 1 --branch cua-spaces-v0.15.0 https://github.com/trycua/cua ~/bench/cua
(cd ~/bench/cua/libs/cua && cargo build --locked --release -p cua-sdk --example rollout_bench --example channel_bench)
export PATH="$HOME/bench/Cua Spaces.app/Contents/MacOS:$PATH" CUA_HOME=~/bench/home DO_NOT_TRACK=1 CUA_TELEMETRY=0
RB=~/bench/cua/libs/cua/target/release/examples/rollout_bench
cua daemon start --foreground & # with CUA_POOL_AUTO=off in its environment
IMG=ghcr.io/trycua/linux:24.04-slim
$RB create --prefix warm- --n 1 --image $IMG --kind vm --cpus 1 --memory-mb 1024 --headless # excluded warm-up
$RB create --prefix cold- --n 30 --conc 1 --image $IMG --kind vm --cpus 1 --memory-mb 1024 --headless # one JSON line per sample (ready_ms)Cua commands use the published Cua Spaces 0.15.0 release and the public trycua/cua repository at the tag cua-spaces-v0.15.0. Downloads: samples (CSV), result (JSON), this page as Markdown.
Questions
What does the time include?
From the create call until the Space's cua-spacesd answers a first `sh -c true`: create, attach and the first command. The warm pool was off, so every sample is a real create. One warm-up create, which pulls the image and records the golden snapshot, is excluded.
Is this the full desktop?
No. These Spaces are headless: only cua-spacesd runs in them. The full desktop image starts slower and is not measured here.
Can I run this myself?
Yes. The commands under Reproduce use the published Cua Spaces 0.15.0 release and the public trycua/cua repository at the tag cua-spaces-v0.15.0. A `cua bench run` command that wraps them is coming; it isn't in a release yet.
Checked 2026-10-25. Sources: the samples and result files above, measured by Cua. All benchmarks.