# Sandbox bench results

Sandbox bench: cloud sandbox providers for AI agents, timed through one SDK (Sandbox SDK, built by us; 0.2.0 is public on npm and the 1.0 used here will be published soon) from one server in Florida, US, on two tracks: each provider's default machine, and the same 4 vCPU, 8 GB machine. Medians, p95s and 95% confidence intervals per provider; every provider-side failure kept, failures caused by our own code set aside.

JSON: /results.json. Guide: /llms.txt.

Pick a track first: `tracks.default` compares each provider's default sandbox, so sizes differ; `tracks["same-spec"]` asks every provider for 4 vCPU and 8 GB. In same-spec, `allocation.equalSpec: false` means the machine measured inside was not 4 vCPU, 8 GB, so compare that provider with care. median and p95 are in `unit`; `better` says which direction wins; results are sorted best first. attempts counts every try, failed included. A null median means the provider does not support the test, every attempt failed, or the result is excluded (see `status`). Cold start is the provider's own time, create() until the first command; `sdkReady` adds our SDK's setup and is ours, not the provider's. `costPerTask.kind` is billed (provider charge), metered (provider usage at published rates) or estimate (list price, where billing gives no amount); a task is one sandbox that is created, runs the 100-call tool replay and is deleted, from a separate cost run: never compare them as if they were the same kind without saying so.

A task is: create a sandbox, run the 100-call tool replay, delete it, priced from a separate cost run. Prices cover compute only; disk, transfer, subscriptions and credits are excluded. boxd bills in euros, converted at the ECB rate.

# Track: Default machines

Each provider's default sandbox, so machine sizes differ.

Run m-default: 2026-10-22 to 2026-10-22.

Boat: coming in the next update. Our Boat plan allows 200 creates a day, and this run used them up; a higher plan or quota may lift that.

## Quick picks

| Need | Pick | Runner-up |
| --- | --- | --- |
| Fastest cold start | Superserve 0.51 s | E2B 0.56 s |
| Fastest agent work (tool replay) | Daytona 11 s | Superserve 12 s |
| Fastest 25-sandbox fan-out | Superserve 0.79 s | E2B 1.0 s |
| Fastest reconnect | Daytona 0.33 s | Superserve 0.34 s |
| Cheapest task | Upstash Box $0.00023 per task, $0.23 per 1,000 (billed) | Daytona $0.00024 per task, $0.24 per 1,000 (billed) |
| Most reliable | E2B, Daytona, Freestyle, Superserve 100.00% (tied) | Tenki 99.91% |

## Machines and cost

| Provider | Asked for | Measured inside | 4 vCPU, 8 GB? | Ran in | Cost per task | Per 1,000 tasks | Cost kind | Price per hour | Success rate |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| E2B | 2 vCPU, 512 MB, template base | 2 vCPU, 473 MB | no | The Dalles, US | $0.00049 | $0.49 | metered | $0.109 | 100.00% |
| Daytona | 1 vCPU, 1 GB | 1 vCPU, 1 GB | no | not reported | $0.00024 | $0.24 | billed | $0.067 | 100.00% |
| Upstash Box | 2 vCPU, 4 GB | 2 vCPU, 4 GB | no | Ashburn, US | $0.00023 | $0.23 | billed | $0.1 | 99.72% |
| boxd | 2 vCPU, 8 GB | 2 vCPU, 7.8 GB | no | Frankfurt am Main, DE | $0.0010 | $1.00 | metered | $0.195 (EUR 0.174) | 99.91% |
| Freestyle | 4 vCPU, 8 GB | 4 vCPU, 7.8 GB | yes | San Francisco, US | $0.0017 | $1.71 | estimate | $0.264 | 100.00% |
| Tenki | provider default | 2 vCPU, 3.8 GB | no | Seattle, US | $0.00090 | $0.90 | metered | $0.162 | 99.91% |
| Superserve | 1 vCPU, 1 GB, template sandbox-bench-node22-py311-1x1-pinned | 1 vCPU, 994 MB | no | Washington, US | $0.00025 | $0.25 | estimate | $0.067 | 100.00% |

Machine note on E2B: E2B's default base template is 2 vCPU and 512 MB. E2B's pricing page says its default sandbox has 4 GB, so E2B ran smaller here than that.

Machine note on Tenki: Tenki documents a 5 GiB default disk but not a default vCPU or RAM, so those are what we measured.

Machine note on Superserve: Superserve ran a template we built with Node 22 and Python 3.11 preinstalled, at its default 1 vCPU, 1 GB RAM and 4 GB disk. Superserve's own templates have Node (node-22) or Python (python-3.11), not both, and our tests need both.

Cost on E2B: Metered over 10 tasks, medium confidence.
Cost on Daytona: Billed over 10 tasks, medium confidence.
Cost on Upstash Box: Billed over 10 tasks, high confidence.
Cost on boxd: Metered over 10 tasks, medium confidence.
Cost on Freestyle: Estimate over 10 tasks, low confidence.
Cost on Tenki: Metered over 10 tasks, medium confidence.
Cost on Superserve: Estimate over 10 tasks, low confidence.

## Ready through Sandbox SDK

Cold start plus our SDK's setup. The setup is ours, not the provider's.

| Provider | Ready through SDK, median | Our SDK setup, median |
| --- | --- | --- |
| E2B | 1.3 s | 0.78 s |
| Daytona | 5.8 s | 2.6 s |
| Upstash Box | 12 s | 7.3 s |
| boxd | 3.2 s | 1.8 s |
| Freestyle | 1.6 s | 0.97 s |
| Tenki | 2.0 s | 1.0 s |
| Superserve | 1.3 s | 0.81 s |

## Start-up

### Cold start

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 0.51 s | 3.4 s | 100 | 0 | measured |
| 2 | E2B | 0.56 s | 3.2 s | 100 | 0 | measured |
| 3 | Freestyle | 0.63 s | 1.4 s | 100 | 0 | measured |
| 4 | Tenki | 0.87 s | 4.1 s | 100 | 0 | measured |
| 5 | boxd | 1.4 s | 4.2 s | 100 | 0 | measured |
| 6 | Daytona | 1.6 s | 5.8 s | 100 | 0 | measured |
| 7 | Upstash Box | 3.0 s | 23 s | 100 | 0 | measured |

## Agent work

### Agent tool replay

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 11 s | 31 s | 30 | 0 | measured |
| 2 | Superserve | 12 s | 15 s | 30 | 0 | measured |
| 3 | E2B | 15 s | 17 s | 30 | 0 | measured |
| 4 | Tenki | 17 s | 21 s | 30 | 0 | measured |
| 5 | Freestyle | 20 s | 23 s | 30 | 0 | measured |
| 6 | Upstash Box | 24 s | 30 s | 30 | 1 | measured |
| 7 | boxd | 31 s | 34 s | 30 | 0 | measured |

### npm install

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Upstash Box | 0.97 s | 1.1 s | 30 | 1 | measured |
| 2 | Daytona | 1.1 s | 1.8 s | 30 | 0 | measured |
| 3 | Superserve | 1.2 s | 1.9 s | 30 | 0 | measured |
| 4 | boxd | 1.4 s | 2.1 s | 30 | 0 | measured |
| 5 | Tenki | 1.4 s | 2.2 s | 30 | 0 | measured |
| 6 | Freestyle | 1.6 s | 7.1 s | 30 | 0 | measured |
| 7 | E2B | 1.9 s | 2.6 s | 30 | 0 | measured |

### pip install

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Tenki | 3.2 s | 5.8 s | 30 | 0 | measured |
| 2 | Superserve | 3.6 s | 4.2 s | 30 | 0 | measured |
| 3 | Upstash Box | 3.7 s | 4.2 s | 30 | 0 | measured |
| 4 | boxd | 4.3 s | 4.7 s | 30 | 0 | measured |
| 5 | Daytona | 4.4 s | 4.9 s | 30 | 0 | measured |
| 6 | E2B | 4.6 s | 6.0 s | 30 | 0 | measured |
| 7 | Freestyle | 7.3 s | 10 s | 30 | 0 | measured |

### git clone

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.45 s | 1.00 s | 30 | 0 | measured |
| 2 | Upstash Box | 0.55 s | 0.89 s | 30 | 1 | measured |
| 3 | E2B | 1.0 s | 2.0 s | 30 | 0 | measured |
| 4 | Tenki | 1.1 s | 1.5 s | 30 | 0 | measured |
| 5 | Freestyle | 1.3 s | 1.8 s | 30 | 0 | measured |
| 6 | Superserve | 1.3 s | 2.5 s | 30 | 0 | measured |
| 7 | boxd | 1.5 s | 1.7 s | 30 | 0 | measured |

### Dev server ready

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 1.6 s | 2.7 s | 30 | 0 | measured |
| 2 | Freestyle | 1.8 s | 3.1 s | 30 | 0 | measured |
| 3 | Tenki | 1.9 s | 4.9 s | 30 | 0 | measured |
| 4 | E2B | 2.3 s | 3.0 s | 30 | 0 | measured |
| 5 | Daytona | 3.0 s | 8.6 s | 30 | 0 | measured |
| 6 | Upstash Box | 3.2 s | 4.8 s | 29 | 0 | measured |
| 7 | boxd | 3.7 s | 4.3 s | 30 | 0 | measured |

### Preview URL first byte

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 0.16 s | 0.24 s | 30 | 0 | measured |
| 2 | Upstash Box | 0.19 s | 0.56 s | 29 | 0 | measured |
| 3 | Daytona | 0.19 s | 0.35 s | 30 | 0 | measured |
| 4 | E2B | 0.23 s | 0.44 s | 30 | 0 | measured |
| 5 | Tenki | 0.35 s | 0.44 s | 30 | 0 | measured |
| 6 | Freestyle | 0.37 s | 0.54 s | 30 | 0 | measured |
| 7 | boxd | 0.81 s | 0.99 s | 30 | 0 | measured |

### Edit, rebuild, reload

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.25 s | 0.82 s | 30 | 0 | measured |
| 2 | Freestyle | 0.26 s | 0.56 s | 30 | 0 | measured |
| 3 | E2B | 0.32 s | 0.51 s | 30 | 0 | measured |
| 4 | Upstash Box | 0.39 s | 0.43 s | 29 | 0 | measured |
| 5 | Superserve | 0.50 s | 1.4 s | 30 | 0 | measured |
| 6 | Tenki | 0.51 s | 0.77 s | 30 | 0 | measured |
| 7 | boxd | 0.96 s | 0.98 s | 30 | 0 | measured |

## Everyday calls

### Run a command

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.12 s | 0.29 s | 100 | 0 | measured |
| 2 | E2B | 0.12 s | 0.28 s | 100 | 0 | measured |
| 3 | Freestyle | 0.15 s | 0.20 s | 100 | 0 | measured |
| 4 | Superserve | 0.15 s | 0.23 s | 100 | 0 | measured |
| 5 | Tenki | 0.17 s | 0.19 s | 100 | 0 | measured |
| 6 | Upstash Box | 0.22 s | 0.32 s | 100 | 0 | measured |
| 7 | boxd | 0.29 s | 0.29 s | 100 | 0 | measured |

### Write + read 1 KB

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 0.08 s | 0.09 s | 100 | 0 | measured |
| 2 | Daytona | 0.13 s | 0.48 s | 100 | 0 | measured |
| 3 | Freestyle | 0.18 s | 0.23 s | 100 | 0 | measured |
| 4 | Tenki | 0.19 s | 0.30 s | 100 | 0 | measured |
| 5 | E2B | 0.20 s | 0.22 s | 100 | 0 | measured |
| 6 | Upstash Box | 0.34 s | 3.0 s | 100 | 0 | measured |
| 7 | boxd | 0.47 s | 0.48 s | 100 | 0 | measured |

### Write + read 10 MB

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 0.59 s | 3.6 s | 100 | 0 | measured |
| 2 | Daytona | 0.74 s | 3.4 s | 100 | 0 | measured |
| 3 | E2B | 1.3 s | 4.8 s | 100 | 0 | measured |
| 4 | Tenki | 2.4 s | 7.5 s | 100 | 0 | measured |
| 5 | boxd | 3.1 s | 6.1 s | 100 | 1 | measured |
| 6 | Freestyle | 3.5 s | 22 s | 92 | 0 | measured |
| 7 | Upstash Box | 3.7 s | 9.7 s | 100 | 0 | measured |

### Reconnect

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.33 s | 0.88 s | 100 | 0 | measured |
| 2 | Superserve | 0.34 s | 2.2 s | 100 | 0 | measured |
| 3 | Upstash Box | 0.51 s | 3.4 s | 100 | 0 | measured |
| 4 | E2B | 0.51 s | 2.5 s | 100 | 0 | measured |
| 5 | Freestyle | 0.53 s | 0.91 s | 100 | 0 | measured |
| 6 | Tenki | 0.78 s | 0.99 s | 100 | 0 | measured |
| 7 | boxd | 1.1 s | 3.7 s | 100 | 0 | measured |

### Destroy

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | E2B | 0.11 s | 0.12 s | 100 | 0 | measured |
| 2 | Tenki | 0.13 s | 0.16 s | 100 | 0 | measured |
| 3 | boxd | 0.15 s | 0.16 s | 100 | 0 | measured |
| 4 | Freestyle | 0.19 s | 0.28 s | 100 | 0 | measured |
| 5 | Superserve | 0.20 s | 0.42 s | 100 | 0 | measured |
| 6 | Upstash Box | 0.75 s | 9.4 s | 100 | 0 | measured |
| 7 | Daytona | 0.95 s | 4.1 s | 100 | 0 | measured |

## Pause and snapshots

### Pause + resume

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | boxd | 0.54 s | 3.2 s | 100 | 0 | measured |
| 2 | Freestyle | 0.64 s | 2.8 s | 100 | 0 | measured |
| 3 | E2B | 0.74 s | 3.6 s | 100 | 0 | measured |
| 4 | Superserve | 0.92 s | 3.7 s | 100 | 0 | measured |
| 5 | Upstash Box | 1.7 s | 13 s | 100 | 0 | measured |
| 6 | Tenki | 58 s | 82 s | 100 | 0 | measured |
| - | Daytona | n/a | n/a | 0 | 0 | unsupported: Daytona's container sandboxes have no pause: stop and start restarts the sandbox and ends every running process. |

### Take snapshot

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Freestyle | 0.26 s | 0.69 s | 30 | 0 | measured |
| 2 | E2B | 0.33 s | 0.59 s | 30 | 0 | measured |
| 3 | Superserve | 0.36 s | 0.46 s | 30 | 0 | measured |
| 4 | boxd | 3.2 s | 4.7 s | 30 | 0 | measured |
| 5 | Upstash Box | 4.1 s | 35 s | 30 | 0 | measured |
| 6 | Daytona | 6.5 s | 390 s | 30 | 0 | measured |
| 7 | Tenki | 6.8 s | 8.9 s | 30 | 1 | measured |

### Start from snapshot

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 0.47 s | 0.56 s | 30 | 0 | measured |
| 2 | Freestyle | 0.67 s | 1.0 s | 30 | 0 | measured |
| 3 | E2B | 0.84 s | 1.2 s | 30 | 0 | measured |
| 4 | boxd | 1.3 s | 1.6 s | 30 | 0 | measured |
| 5 | Daytona | 2.0 s | 3.8 s | 30 | 0 | measured |
| 6 | Tenki | 2.1 s | 3.0 s | 29 | 0 | measured |
| 7 | Upstash Box | 4.7 s | 24 s | 30 | 0 | measured |

## Bursts

### 10 at once, all ready

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 0.72 s | 0.72 s | 3 | 0 | measured |
| 2 | E2B | 1.0 s | 1.2 s | 3 | 0 | measured |
| 3 | Freestyle | 1.1 s | 1.1 s | 3 | 0 | measured |
| 4 | Tenki | 1.2 s | 1.8 s | 3 | 0 | measured |
| 5 | boxd | 2.2 s | 2.9 s | 3 | 0 | measured |
| 6 | Daytona | 2.8 s | 4.4 s | 3 | 0 | measured |
| 7 | Upstash Box | 3.8 s | 13 s | 3 | 0 | measured |

### 25 at once, all ready

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 0.79 s | 0.92 s | 3 | 0 | measured |
| 2 | E2B | 1.0 s | 1.1 s | 3 | 0 | measured |
| 3 | Tenki | 1.2 s | 1.5 s | 3 | 0 | measured |
| 4 | Freestyle | 1.3 s | 2.3 s | 3 | 0 | measured |
| - | Daytona | n/a | n/a | 0 | 0 | not-run: our Daytona account's 10 vCPU quota can't hold 25 sandboxes at once |
| - | Upstash Box | n/a | n/a | 0 | 0 | stopped-early: two of its three bursts of 25 never started, because our harness still had two of its own sandboxes open and Upstash's 25-sandbox account cap left no room; not counted; coming in the next update |
| - | boxd | n/a | n/a | 0 | 0 | stopped-early: one of its three bursts of 25 was cut short by our own ownership check (16 creates and 5 deletes failed on our side), so it is not counted; coming in the next update |

## Machine speed

### CPU, one core

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 18.7M/s | 19M/s | 100 | 0 | measured |
| 2 | Tenki | 16.7M/s | 20.9M/s | 100 | 0 | measured |
| 3 | Upstash Box | 13.7M/s | 13.8M/s | 100 | 0 | measured |
| 4 | boxd | 12.2M/s | 13M/s | 100 | 0 | measured |
| 5 | E2B | 10.8M/s | 15.5M/s | 100 | 0 | measured |
| 6 | Freestyle | 9.8M/s | 10.4M/s | 100 | 0 | measured |
| 7 | Daytona | 9M/s | 9.9M/s | 100 | 0 | measured |

### CPU, all cores

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Freestyle | 27.5M/s | 32.6M/s | 100 | 0 | measured |
| 2 | Upstash Box | 24.7M/s | 25.7M/s | 100 | 0 | measured |
| 3 | Tenki | 20.2M/s | 30.5M/s | 100 | 0 | measured |
| 4 | boxd | 15.8M/s | 20.6M/s | 100 | 0 | measured |
| 5 | E2B | 15.4M/s | 20.7M/s | 100 | 0 | measured |
| 6 | Superserve | 12.3M/s | 16.7M/s | 100 | 0 | measured |
| 7 | Daytona | 7M/s | 7.8M/s | 100 | 0 | measured |

### Memory bandwidth

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Tenki | 37.2 GB/s | 51.7 GB/s | 100 | 0 | measured |
| 2 | Upstash Box | 36.0 GB/s | 41.0 GB/s | 100 | 0 | measured |
| 3 | Daytona | 30.8 GB/s | 33.9 GB/s | 100 | 0 | measured |
| 4 | boxd | 22.3 GB/s | 24.8 GB/s | 100 | 0 | measured |
| 5 | Superserve | 16.8 GB/s | 17.1 GB/s | 100 | 0 | measured |
| 6 | Freestyle | 14.1 GB/s | 20.0 GB/s | 100 | 0 | measured |
| 7 | E2B | 12.6 GB/s | 14.3 GB/s | 100 | 0 | measured |

### Disk write

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Upstash Box | 1.7 GB/s | 2.1 GB/s | 100 | 0 | measured |
| 2 | Daytona | 1.2 GB/s | 2.9 GB/s | 100 | 0 | measured |
| 3 | E2B | 947 MB/s | 1.2 GB/s | 100 | 0 | measured |
| 4 | boxd | 743 MB/s | 817 MB/s | 100 | 0 | measured |
| 5 | Tenki | 313 MB/s | 580 MB/s | 100 | 0 | measured |
| 6 | Freestyle | 229 MB/s | 258 MB/s | 100 | 0 | measured |
| 7 | Superserve | 156 MB/s | 838 MB/s | 100 | 0 | measured |

### Disk read

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Upstash Box | 20.9 GB/s | 22.9 GB/s | 100 | 0 | measured |
| 2 | Daytona | 16.4 GB/s | 17.6 GB/s | 100 | 0 | measured |
| 3 | boxd | 11.2 GB/s | 14.4 GB/s | 100 | 0 | measured |
| 4 | Tenki | 10.9 GB/s | 21.7 GB/s | 100 | 0 | measured |
| 5 | Freestyle | 7.2 GB/s | 9.1 GB/s | 100 | 0 | measured |
| 6 | E2B | 6.5 GB/s | 8.0 GB/s | 100 | 0 | measured |
| 7 | Superserve | 4.7 GB/s | 8.0 GB/s | 100 | 0 | measured |

### 4K random write

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 20.8K IOPS | 34.5K IOPS | 100 | 0 | measured |
| 2 | Daytona | 19.3K IOPS | 29.9K IOPS | 100 | 0 | measured |
| 3 | boxd | 8.5K IOPS | 13.7K IOPS | 100 | 0 | measured |
| 4 | E2B | 7.2K IOPS | 9.1K IOPS | 100 | 0 | measured |
| 5 | Freestyle | 6.7K IOPS | 8.6K IOPS | 100 | 0 | measured |
| 6 | Upstash Box | 382.7 IOPS | 562.1 IOPS | 100 | 0 | measured |
| 7 | Tenki | 363.6 IOPS | 423.1 IOPS | 100 | 0 | measured |

### 4K random read

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Superserve | 713.4K IOPS | 753.1K IOPS | 100 | 0 | measured |
| 2 | Upstash Box | 509.1K IOPS | 527.3K IOPS | 100 | 0 | measured |
| 3 | E2B | 479.9K IOPS | 644.4K IOPS | 100 | 0 | measured |
| 4 | boxd | 425.3K IOPS | 465.7K IOPS | 100 | 0 | measured |
| 5 | Daytona | 344.1K IOPS | 400.8K IOPS | 100 | 0 | measured |
| 6 | Freestyle | 288.9K IOPS | 345.8K IOPS | 100 | 0 | measured |
| 7 | Tenki | 221.7K IOPS | 587.8K IOPS | 100 | 0 | measured |

## What failed

- E2B: no failures counted against the provider.
- Daytona: no failures counted against the provider.
- Upstash Box: Upstash Box exec failed (provider). (provider): 1 runs, 1 failed tests (provider-operation; Agent tool replay); Upstash Box files.write failed (unavailable, HTTP 500). (unavailable, HTTP 500, operation=files.write): 1 runs, 1 failed tests (provider-operation; npm install); Guest exit 143: Cloning into '/workspace/bench-clone'...: 1 runs, 1 failed tests (provider-operation; git clone).
- boxd: boxd request failed. (provider): 1 runs, 1 failed tests (provider-operation; Write + read 10 MB). Set aside, not counted: Our ownership check failed during one burst of 25 (16 creates, 5 deletes), so that burst is not counted (1 runs, 21 failed tests).
- Freestyle: no failures counted against the provider. Set aside, not counted: Our SDK timed out or wrapped the error moving 10 MB, so we can't tell whose side failed (8 runs, 8 failed tests).
- Tenki: Tenki request failed (not_found). (not_found, 5, operation=snapshot): 1 runs, 1 failed tests (provider-operation; Take snapshot). Set aside, not counted: Our cleanup check could not confirm the sandbox after Tenki's snapshot failed, so we can't tell whose side the delete failure was on (1 runs, 2 failed tests).
- Superserve: no failures counted against the provider.

# Track: Same machine: 4 vCPU, 8 GB

Every provider asked for Boat's machine, 4 vCPU and 8 GB, or its nearest size.

Run m-same: 2026-10-22 to 2026-10-22.

Boat: coming in the next update. Our Boat plan allows 200 creates a day, and this run used them up; a higher plan or quota may lift that.
Superserve: not in this track: our Superserve plan caps templates at 2 vCPU, so there was no 4 vCPU machine to test. A paid plan may lift this; we will add it if it does.

## Quick picks

| Need | Pick | Runner-up |
| --- | --- | --- |
| Fastest cold start | Freestyle 0.66 s | E2B 0.95 s |
| Fastest agent work (tool replay) | Daytona 11 s | E2B 15 s |
| Fastest 25-sandbox fan-out | Freestyle 1.4 s | E2B 1.5 s |
| Fastest reconnect | Daytona 0.31 s | Upstash Box 0.52 s |
| Cheapest task | Upstash Box $0.00047 per task, $0.47 per 1,000 (billed) | Daytona $0.0012 per task, $1.19 per 1,000 (billed) |
| Most reliable | E2B, Daytona, Tenki 100.00% (tied) | Freestyle 99.91% |

## Machines and cost

| Provider | Asked for | Measured inside | 4 vCPU, 8 GB? | Ran in | Cost per task | Per 1,000 tasks | Cost kind | Price per hour | Success rate |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| E2B | 4 vCPU, 8 GB, template r1h7gud12rf1f6iu29r0 | 4 vCPU, 7.8 GB | yes | The Dalles, US | $0.0016 | $1.55 | metered | $0.331 | 100.00% |
| Daytona | 4 vCPU, 8 GB, template daytona-large | 4 vCPU, 8 GB | yes | not reported | $0.0012 | $1.19 | billed | $0.331 | 100.00% |
| Upstash Box | 4 vCPU, 8 GB ("medium") | 4 vCPU, 8 GB | yes | Ashburn, US | $0.00047 | $0.47 | billed | $0.2 | 99.91% |
| boxd | 4 vCPU, 16 GB | 4 vCPU, 16 GB | no | Frankfurt am Main, DE | $0.0020 | $2.00 | metered | $0.391 (EUR 0.348) | 99.81% |
| Freestyle | 4 vCPU, 8 GB | 4 vCPU, 7.8 GB | yes | San Francisco, US | $0.0018 | $1.78 | estimate | $0.264 | 99.91% |
| Tenki | 4 vCPU, 8 GB | 4 vCPU, 7.8 GB | yes | Seattle, US | $0.0019 | $1.89 | metered | $0.331 | 100.00% |

Machine note on boxd: ran 4 vCPU, 16 GB, not 4 vCPU, 8 GB. boxd has no 8 GB size at 4 vCPU; this is its nearest.

Cost on E2B: Metered over 10 tasks, medium confidence.
Cost on Daytona: Billed over 10 tasks, medium confidence.
Cost on Upstash Box: Billed over 8 tasks, high confidence.
Cost on boxd: Metered over 10 tasks, medium confidence.
Cost on Freestyle: Estimate over 10 tasks, low confidence.
Cost on Tenki: Metered over 10 tasks, medium confidence.

## Ready through Sandbox SDK

Cold start plus our SDK's setup. The setup is ours, not the provider's.

| Provider | Ready through SDK, median | Our SDK setup, median |
| --- | --- | --- |
| E2B | 2.1 s | 0.90 s |
| Daytona | 3.4 s | 1.8 s |
| Upstash Box | 8.9 s | 5.2 s |
| boxd | 3.2 s | 1.8 s |
| Freestyle | 1.7 s | 0.96 s |
| Tenki | 2.0 s | 1.0 s |

## Start-up

### Cold start

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Freestyle | 0.66 s | 2.8 s | 100 | 0 | measured |
| 2 | E2B | 0.95 s | 3.1 s | 100 | 0 | measured |
| 3 | Tenki | 0.96 s | 3.0 s | 78 | 0 | measured |
| 4 | Daytona | 1.1 s | 3.0 s | 100 | 0 | measured |
| 5 | boxd (machine differs) | 1.4 s | 3.9 s | 100 | 0 | measured |
| 6 | Upstash Box | 2.7 s | 9.1 s | 100 | 1 | measured |

## Agent work

### Agent tool replay

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 11 s | 29 s | 30 | 0 | measured |
| 2 | E2B | 15 s | 16 s | 30 | 0 | measured |
| 3 | Freestyle | 20 s | 28 s | 30 | 0 | measured |
| 4 | Tenki | 21 s | 34 s | 30 | 0 | measured |
| 5 | Upstash Box | 28 s | 54 s | 30 | 0 | measured |
| 6 | boxd (machine differs) | 33 s | 49 s | 30 | 0 | measured |

### npm install

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.74 s | 1.2 s | 30 | 0 | measured |
| 2 | Upstash Box | 0.99 s | 2.6 s | 30 | 0 | measured |
| 3 | Tenki | 1.5 s | 3.6 s | 30 | 0 | measured |
| 4 | boxd (machine differs) | 1.5 s | 2.6 s | 30 | 0 | measured |
| 5 | Freestyle | 1.6 s | 2.7 s | 30 | 0 | measured |
| 6 | E2B | 1.9 s | 2.8 s | 30 | 0 | measured |

### pip install

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Tenki | 3.3 s | 6.1 s | 30 | 0 | measured |
| 2 | Upstash Box | 3.6 s | 6.3 s | 30 | 0 | measured |
| 3 | Daytona | 4.1 s | 6.1 s | 30 | 0 | measured |
| 4 | boxd (machine differs) | 4.6 s | 5.9 s | 30 | 0 | measured |
| 5 | E2B | 4.8 s | 5.7 s | 30 | 0 | measured |
| 6 | Freestyle | 7.4 s | 8.1 s | 30 | 0 | measured |

### git clone

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.44 s | 2.1 s | 30 | 0 | measured |
| 2 | Upstash Box | 0.56 s | 2.8 s | 30 | 0 | measured |
| 3 | Tenki | 1.1 s | 3.2 s | 30 | 0 | measured |
| 4 | E2B | 1.1 s | 1.9 s | 30 | 0 | measured |
| 5 | boxd (machine differs) | 1.6 s | 2.6 s | 30 | 0 | measured |
| 6 | Freestyle | 1.7 s | 2.8 s | 30 | 0 | measured |

### Dev server ready

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Tenki | 1.9 s | 4.4 s | 30 | 0 | measured |
| 2 | E2B | 1.9 s | 2.9 s | 30 | 0 | measured |
| 3 | Freestyle | 2.0 s | 3.2 s | 30 | 0 | measured |
| 4 | Daytona | 2.9 s | 9.5 s | 30 | 0 | measured |
| 5 | Upstash Box | 3.2 s | 8.5 s | 30 | 0 | measured |
| 6 | boxd (machine differs) | 3.7 s | 7.1 s | 30 | 0 | measured |

### Preview URL first byte

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.18 s | 0.36 s | 30 | 0 | measured |
| 2 | Upstash Box | 0.19 s | 0.23 s | 30 | 0 | measured |
| 3 | E2B | 0.22 s | 0.45 s | 30 | 0 | measured |
| 4 | Tenki | 0.34 s | 1.8 s | 30 | 0 | measured |
| 5 | Freestyle | 0.39 s | 0.49 s | 30 | 1 | measured |
| 6 | boxd (machine differs) | 0.83 s | 1.9 s | 30 | 0 | measured |

### Edit, rebuild, reload

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.24 s | 0.99 s | 30 | 0 | measured |
| 2 | Freestyle | 0.27 s | 0.48 s | 30 | 0 | measured |
| 3 | E2B | 0.30 s | 0.50 s | 30 | 0 | measured |
| 4 | Upstash Box | 0.39 s | 1.5 s | 30 | 0 | measured |
| 5 | Tenki | 0.52 s | 1.8 s | 30 | 0 | measured |
| 6 | boxd (machine differs) | 0.96 s | 3.2 s | 30 | 0 | measured |

## Everyday calls

### Run a command

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.11 s | 0.28 s | 100 | 0 | measured |
| 2 | E2B | 0.12 s | 0.14 s | 100 | 0 | measured |
| 3 | Freestyle | 0.15 s | 0.21 s | 100 | 0 | measured |
| 4 | Tenki | 0.17 s | 0.20 s | 78 | 0 | measured |
| 5 | Upstash Box | 0.23 s | 0.50 s | 99 | 0 | measured |
| 6 | boxd (machine differs) | 0.28 s | 0.29 s | 100 | 0 | measured |

### Write + read 1 KB

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.12 s | 0.45 s | 100 | 0 | measured |
| 2 | Freestyle | 0.18 s | 0.40 s | 100 | 0 | measured |
| 3 | E2B | 0.20 s | 0.35 s | 100 | 0 | measured |
| 4 | Tenki | 0.27 s | 0.37 s | 77 | 0 | measured |
| 5 | Upstash Box | 0.34 s | 1.1 s | 99 | 0 | measured |
| 6 | boxd (machine differs) | 0.47 s | 0.48 s | 100 | 0 | measured |

### Write + read 10 MB

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.76 s | 3.7 s | 100 | 0 | measured |
| 2 | E2B | 1.3 s | 2.5 s | 100 | 0 | measured |
| 3 | Freestyle | 2.5 s | 5.5 s | 97 | 0 | measured |
| 4 | boxd (machine differs) | 3.0 s | 4.8 s | 99 | 1 | measured |
| 5 | Upstash Box | 3.0 s | 9.6 s | 99 | 0 | measured |
| 6 | Tenki | 6.2 s | 11 s | 78 | 0 | measured |

### Reconnect

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 0.31 s | 1.2 s | 100 | 0 | measured |
| 2 | Upstash Box | 0.52 s | 1.1 s | 99 | 0 | measured |
| 3 | E2B | 0.53 s | 2.3 s | 100 | 0 | measured |
| 4 | Freestyle | 0.54 s | 1.8 s | 100 | 0 | measured |
| 5 | Tenki | 0.78 s | 1.6 s | 77 | 0 | measured |
| 6 | boxd (machine differs) | 1.1 s | 3.3 s | 100 | 0 | measured |

### Destroy

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | E2B | 0.12 s | 0.13 s | 100 | 0 | measured |
| 2 | Tenki | 0.13 s | 0.17 s | 78 | 0 | measured |
| 3 | boxd (machine differs) | 0.14 s | 0.16 s | 100 | 0 | measured |
| 4 | Freestyle | 0.20 s | 0.43 s | 100 | 0 | measured |
| 5 | Daytona | 0.88 s | 2.4 s | 100 | 0 | measured |
| 6 | Upstash Box | 1.0 s | 18 s | 95 | 0 | measured |

## Pause and snapshots

### Pause + resume

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | boxd (machine differs) | 0.53 s | 1.1 s | 100 | 1 | measured |
| 2 | Freestyle | 0.72 s | 2.6 s | 100 | 0 | measured |
| 3 | Upstash Box | 1.6 s | 12 s | 99 | 0 | measured |
| 4 | E2B | 1.8 s | 3.5 s | 100 | 0 | measured |
| 5 | Tenki | 64 s | 84 s | 77 | 0 | measured |
| - | Daytona | n/a | n/a | 0 | 0 | unsupported: Daytona's container sandboxes have no pause: stop and start restarts the sandbox and ends every running process. |

### Take snapshot

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Freestyle | 0.26 s | 0.77 s | 30 | 0 | measured |
| 2 | E2B | 1.5 s | 2.2 s | 30 | 0 | measured |
| 3 | Upstash Box | 2.1 s | 10 s | 30 | 0 | measured |
| 4 | boxd (machine differs) | 4.0 s | 4.8 s | 26 | 0 | measured |
| 5 | Tenki | 6.8 s | 7.0 s | 30 | 0 | measured |
| - | Daytona | n/a | n/a | 0 | 0 | not-run: our Daytona account's 10 vCPU quota kept its 4 vCPU snapshot tests from running |

### Start from snapshot

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Freestyle | 0.65 s | 0.92 s | 30 | 0 | measured |
| 2 | E2B | 1.3 s | 2.6 s | 30 | 0 | measured |
| 3 | boxd (machine differs) | 1.4 s | 1.5 s | 26 | 0 | measured |
| 4 | Tenki | 1.9 s | 3.6 s | 30 | 0 | measured |
| 5 | Upstash Box | 4.6 s | 27 s | 30 | 0 | measured |
| - | Daytona | n/a | n/a | 0 | 0 | not-run: our Daytona account's 10 vCPU quota kept its 4 vCPU snapshot tests from running |

## Bursts

### 10 at once, all ready

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Freestyle | 1.0 s | 1.0 s | 3 | 0 | measured |
| 2 | Tenki | 1.2 s | 1.3 s | 3 | 0 | measured |
| 3 | E2B | 1.4 s | 1.6 s | 3 | 0 | measured |
| 4 | Upstash Box | 21 s | 25 s | 3 | 0 | measured |
| - | Daytona | n/a | n/a | 0 | 0 | not-run: our Daytona account's 10 vCPU quota can't hold ten 4 vCPU sandboxes at once |
| - | boxd (machine differs) | n/a | n/a | 0 | 0 | stopped-early: one of its three bursts of 10 was cut short by our own ownership check (1 create failed on our side), so it is not counted; coming in the next update |

### 25 at once, all ready

Median and p95, lower is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Freestyle | 1.4 s | 1.5 s | 3 | 0 | measured |
| 2 | E2B | 1.5 s | 2.9 s | 3 | 0 | measured |
| 3 | Tenki | 1.7 s | 2.6 s | 3 | 0 | measured |
| 4 | boxd (machine differs) | 6.2 s | 6.9 s | 3 | 0 | measured |
| - | Daytona | n/a | n/a | 0 | 0 | not-run: our Daytona account's 10 vCPU quota can't hold 25 4 vCPU sandboxes at once |
| - | Upstash Box | n/a | n/a | 0 | 0 | stopped-early: its third burst of 25 never started, because our harness still had one of its own sandboxes open and Upstash's 25-sandbox account cap left no room; not counted; coming in the next update |

## Machine speed

### CPU, one core

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Tenki | 19.6M/s | 21M/s | 78 | 0 | measured |
| 2 | Upstash Box | 13.7M/s | 13.8M/s | 99 | 0 | measured |
| 3 | boxd (machine differs) | 12.1M/s | 12.9M/s | 100 | 0 | measured |
| 4 | E2B | 10.8M/s | 16.1M/s | 100 | 0 | measured |
| 5 | Freestyle | 10M/s | 10.4M/s | 100 | 0 | measured |
| 6 | Daytona | 9.2M/s | 14.2M/s | 100 | 0 | measured |

### CPU, all cores

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Upstash Box | 49.9M/s | 50.6M/s | 99 | 0 | measured |
| 2 | Tenki | 36.7M/s | 46.6M/s | 78 | 0 | measured |
| 3 | boxd (machine differs) | 28.4M/s | 31.6M/s | 100 | 0 | measured |
| 4 | Freestyle | 28M/s | 32.7M/s | 100 | 0 | measured |
| 5 | E2B | 27.1M/s | 36.9M/s | 100 | 0 | measured |
| 6 | Daytona | 26.3M/s | 31.3M/s | 100 | 0 | measured |

### Memory bandwidth

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Tenki | 43.6 GB/s | 51.9 GB/s | 78 | 0 | measured |
| 2 | Upstash Box | 36.0 GB/s | 41.7 GB/s | 99 | 0 | measured |
| 3 | Daytona | 31.3 GB/s | 57.7 GB/s | 100 | 0 | measured |
| 4 | boxd (machine differs) | 22.1 GB/s | 24.7 GB/s | 100 | 0 | measured |
| 5 | Freestyle | 17.0 GB/s | 20.8 GB/s | 100 | 0 | measured |
| 6 | E2B | 12.6 GB/s | 14.4 GB/s | 100 | 0 | measured |

### Disk write

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Upstash Box | 1.9 GB/s | 2.2 GB/s | 99 | 0 | measured |
| 2 | Daytona | 1.4 GB/s | 3.0 GB/s | 100 | 0 | measured |
| 3 | E2B | 859 MB/s | 1.1 GB/s | 100 | 0 | measured |
| 4 | boxd (machine differs) | 742 MB/s | 809 MB/s | 100 | 0 | measured |
| 5 | Tenki | 465 MB/s | 595 MB/s | 78 | 0 | measured |
| 6 | Freestyle | 228 MB/s | 258 MB/s | 100 | 0 | measured |

### Disk read

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Upstash Box | 21.4 GB/s | 23.2 GB/s | 99 | 0 | measured |
| 2 | Daytona | 17.4 GB/s | 24.8 GB/s | 100 | 0 | measured |
| 3 | Tenki | 12.2 GB/s | 21.2 GB/s | 78 | 0 | measured |
| 4 | boxd (machine differs) | 11.7 GB/s | 13.7 GB/s | 100 | 0 | measured |
| 5 | Freestyle | 7.5 GB/s | 9.3 GB/s | 100 | 0 | measured |
| 6 | E2B | 6.3 GB/s | 7.6 GB/s | 100 | 0 | measured |

### 4K random write

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Daytona | 21K IOPS | 32.1K IOPS | 100 | 0 | measured |
| 2 | boxd (machine differs) | 8.5K IOPS | 14.2K IOPS | 100 | 0 | measured |
| 3 | Freestyle | 7K IOPS | 8.8K IOPS | 100 | 0 | measured |
| 4 | E2B | 6.7K IOPS | 9.1K IOPS | 100 | 0 | measured |
| 5 | Upstash Box | 402.4 IOPS | 561.1 IOPS | 99 | 0 | measured |
| 6 | Tenki | 357.8 IOPS | 414.4 IOPS | 78 | 0 | measured |

### 4K random read

Median and p95, higher is better. Each cell carries its unit.

| Rank | Provider | Median | p95 | Attempts | Failed | Status |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | Upstash Box | 511.1K IOPS | 531.5K IOPS | 99 | 0 | measured |
| 2 | E2B | 474.3K IOPS | 661.6K IOPS | 100 | 0 | measured |
| 3 | boxd (machine differs) | 427.4K IOPS | 462.9K IOPS | 100 | 0 | measured |
| 4 | Daytona | 357.5K IOPS | 833.5K IOPS | 100 | 0 | measured |
| 5 | Freestyle | 298.7K IOPS | 347.9K IOPS | 100 | 0 | measured |
| 6 | Tenki | 221K IOPS | 603.9K IOPS | 78 | 0 | measured |

## What failed

- E2B: no failures counted against the provider.
- Daytona: no failures counted against the provider.
- Upstash Box: Upstash Box exec failed (provider). (provider): 1 runs, 1 failed tests (provider-operation; Cold start). Set aside, not counted: Our ownership check could not confirm the sandbox before deleting it, so we can't tell whose side failed (3 runs, 5 failed tests). Set aside, not counted: Our ownership check failed on 4 snapshot cleanup steps; none is counted (3 runs, 4 failed tests). Set aside, not counted: Our ownership check failed on 3 burst deletes; none is counted (3 runs, 3 failed tests).
- boxd: boxd request failed. (invalid_argument): 1 runs, 1 failed tests (provider-operation; Pause + resume); boxd request failed. (provider): 1 runs, 1 failed tests (provider-operation; Write + read 10 MB). Set aside, not counted: Our ownership check failed on 4 snapshot attempts, and our 30-second cleanup deadline ran out 8 times; none is counted (12 runs, 12 failed tests). Set aside, not counted: Our ownership check failed on 1 burst create and 13 burst deletes; none is counted (4 runs, 14 failed tests).
- Freestyle: Preview HTTP 502, no first byte: 1 runs, 1 failed tests (provider-operation; Preview URL first byte). Set aside, not counted: Our SDK timed out or wrapped the error moving 10 MB, so we can't tell whose side failed (3 runs, 3 failed tests).
- Tenki: no failures counted against the provider. Set aside, not counted: The run was stopped during this attempt, so it is not counted (1 runs, 1 failed tests).

