Benchmarks
Cold builds, rebuilds, image size and peak RAM of Acropolis against Docker and Railpack.
Sample apps
Cold and rebuild benchmark with 2 CPUs, all three tools on the same day under the same conditions, median of 2 runs. Docker uses an idiomatic multi-stage Dockerfile for each app (bench/dockerfiles).
| app | cold time (Docker / Railpack / Acropolis) | image (Docker / Railpack / Acropolis) | peak RAM (Docker / Railpack / Acropolis) |
|---|---|---|---|
| Express | 16.1 s / 53.7 s / 6.6 s | 81.2 / 147.5 / 54.6 MB | 562 / 2955 / 83 MB |
| Go | 77.9 s / 85.3 s / 41.7 s | 4.3 / 40.8 / 4.2 MB | 2221 / 2944 / 1088 MB |
| Rust | 75.3 s / 112.4 s / 48.2 s | 10.0 / 38.0 / 11.4 MB | 2910 / 4523 / 1509 MB |
| Vite + React | 23.0 s / 55.3 s / 5.2 s | 26.4 / 54.7 / 25.0 MB | 933 / 2863 / 594 MB |
| Vite + MUI | 48.3 s / 77.8 s / 8.4 s | 26.5 / 54.7 / 25.0 MB | 1329 / 3262 / 898 MB |
| TanStack Start | 26.8 s / 78.1 s / 8.1 s | 80.1 / 203.0 / 53.6 MB | 1242 / 3575 / 960 MB |
| Next 15 | 118.1 s / 170.5 s / 47.5 s | 105.4 / 345.6 / 69.8 MB | 3075 / 4560 / 1936 MB |
Rebuild after changing one file (Docker / Railpack / Acropolis): Go 41 s / 5.8 s / 1.1 s, Rust 49 s / 15 s / 6.5 s and Next 71 s / 81 s / 24.8 s.
Peak RAM includes page cache. Anonymous memory, which cannot be reclaimed, is on par with Docker on cold builds and below it on rebuilds: most of it is each language’s compiler, not Acropolis.
A real monorepo
olimpia-cloud (bun workspace; a TanStack Start/Nitro web app and an Axum + sqlx API), against its own production Dockerfiles, 4 CPUs, median of 2 runs:
| app | cold (Docker / Acropolis) | rebuild, one file changed | image, compressed / unpacked | peak RAM, cold / rebuild |
|---|---|---|---|---|
| web | 53.3 s / 42.4 s | 26.0 s / 26.9 s | 66.4 / 259.2 MB vs 57.1 / 224.0 MB | 3077 / 3187 MB vs 3708 / 1875 MB |
| api | 240.5 s / 228.0 s | 109.7 s / 115.3 s | 23.2 / 91.1 MB vs 24.5 / 95.2 MB | 3988 / 3918 MB vs 3483 / 1781 MB |
Here the compilers dominate (vp build ~20 s, cargo build --release of the API ~190 s), and those Dockerfiles are already well tuned (cache mounts, distroless/alpine runtimes), so the gap is small. Acropolis builds them with no Dockerfile: it only needed an acropolis.json input to copy regctl into the API image, as the Dockerfile does.
Reproducing
scripts/bench.sh runs the benchmark against Docker and Railpack, and AB=1 scripts/bench.sh compares two Acropolis binaries interleaved (APPS=, RUNS=). The apps are in bench/apps.