mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-07-31 03:05:21 +00:00
72 lines
2.2 KiB
Markdown
72 lines
2.2 KiB
Markdown
# 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`](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
|
||
|
||
1. **Warmup**: 1 run discarded (DNS cache, disk cache, JIT warmup)
|
||
2. **Measurement**: 3 runs, median reported
|
||
3. **Sampling**: process tree RSS polled every 50ms; peak value recorded
|
||
4. **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
|
||
|
||
```bash
|
||
# 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
|
||
```
|