---
title: Benchmarks
description: Cold builds, rebuilds, image size and peak RAM of Acropolis against Docker and Railpack.
sidebar:
  icon: gauge
---

## 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`](https://github.com/olimpiacloud/acropolis/tree/main/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`](https://github.com/olimpiacloud/acropolis/tree/main/bench/apps).
