| .. | ||
| playwright | ||
| puppeteer | ||
| .gitignore | ||
| README.md | ||
| run_benchmark.sh | ||
Benchmarks
Resource usage comparison of tools that execute JavaScript and render web pages.
Results
Single page (https://example.com)
| Tool | Peak RSS | Time |
|---|---|---|
| curl (no JS) | 3 MB | 0.17s |
| servo-fetch | 64 MB | 0.47s |
| Playwright | 224 MB | 0.82s |
| Puppeteer | 590 MB | 1.60s |
4 pages parallel
| Tool | Peak RSS | Time |
|---|---|---|
| servo-fetch | 114 MB | 1.50s |
| Playwright | 502 MB | 3.26s |
| Puppeteer | 1065 MB | 4.27s |
Key takeaways
- vs Playwright: 3.5× less memory, 1.7–2.2× faster
- vs Puppeteer: 9× less memory, 2.8–3.4× faster
- Per additional page: servo-fetch ~17 MB, Playwright ~93 MB, Puppeteer ~158 MB
Methodology
Task
All tools perform the same operation: navigate to a URL, wait for the load event (JavaScript executed), and extract document.body.innerText. For the parallel test, all URLs are fetched concurrently.
Memory measurement
Peak RSS (Resident Set Size) of the entire process tree — the target process plus all its descendants. Chromium spawns separate renderer processes per page; all are included.
We sample every 50ms using a recursive pgrep -P walk. See run_benchmark.sh for the implementation.
On Linux, smem (PSS) would be more precise for shared memory. macOS does not expose PSS, so we use RSS. This slightly overcounts shared libraries in Chromium's multi-process architecture, but reflects actual system memory pressure (what the OOM killer sees).
Procedure
- Warmup: 1 run discarded (DNS cache, disk cache, JIT warmup)
- Measurement: 3 runs, median reported
- Sampling: process tree RSS polled every 50ms; peak value recorded
- Timing: wall-clock via
time.time()delta
Test machine
- Hardware: Apple M3 Pro, 18 GB RAM
- OS: macOS (arm64)
Versions
Run ./run_benchmark.sh to see exact versions. The script auto-detects and prints all tool versions at the top of its output.
Reproduction
# 1. Build servo-fetch
cargo build --release
# 2. Install comparison tools
cd benchmarks/playwright && npm install && npx playwright install chromium && cd ..
cd puppeteer && npm install && cd ..
# 3. Run
./run_benchmark.sh