Frostholm vs restic vs Borg: a realistic benchmark

Benchmark comparison

Every backup tool benchmark I've read was done by someone with a stake in the result, on a workload that happened to flatter their tool, with methodology that makes reproducibility somewhere between difficult and impossible. I'm not a neutral party here — I wrote Frostholm — but I've tried to be honest about where each tool loses.

Setup: M2 MacBook Air (16 GB RAM), macOS 15.2, internal SSD (read ~3 GB/s). Source: 180 GB photo library, 14,200 files, mix of ARW/NEF RAW files and JPEG exports. Destination: local external USB-C SSD (500 MB/s write). Frostholm v0.3.7, restic 0.17.3, BorgBackup 2.0.0b12. Each tool tested with default settings unless noted. All times are median of 3 runs with warm filesystem cache.

Initial backup (first snapshot, full data)

ToolTimeCPUPeak RAMStored size
Frostholm6m 14s~380%512 MB181 GB
restic7m 02s~320%448 MB183 GB
Borg9m 38s~180%312 MB180 GB

Frostholm and restic are close on initial backup. Borg is slower — it uses LZ4 compression by default and its Python layer adds overhead, though it uses considerably less RAM. Stored sizes are nearly identical because RAW files don't compress and barely deduplicate.

Incremental backup (200 new files added, ~4 GB)

ToolTimeNew data writtenCorrectly deduped
Frostholm38s4.1 GByes
restic44s4.2 GByes
Borg52s4.0 GByes

All three tools handle pure incremental correctly. The time difference is mostly scan speed — how fast each tool can traverse the source tree and check which files changed.

Modified file (renamed a large directory, ~40 GB)

ToolTimeNew data writtenNotes
Frostholm1m 08s~0 GBAll chunks already in index
restic1m 22s~0 GBSame — path-independent hashing
Borg2m 14s~0 GBCache lookup slower on rename

Renaming a directory is a good stress test. All three tools correctly identify that the underlying data didn't change and write nearly nothing. Frostholm and restic are faster because their chunk lookup is pure hash-table O(1); Borg's cache uses a different structure that's slower when file paths change significantly.

Full restore (all 180 GB, local destination)

ToolTimePeak RAM
Frostholm (--parallelism 1)8m 42s380 MB
restic9m 18s412 MB
Borg11m 05s290 MB

Note: this is Frostholm v0.3.7 with single-threaded restore. v0.4 with --parallelism 8 does the same restore in ~5m 10s. For local backends the gain is smaller (I/O bound) but still meaningful.

Single-file restore (recovering one 800 MB RAW file)

ToolTimeData read from repo
Frostholm4.2s812 MB
restic5.1s812 MB
Borg6.8s~820 MB

All three tools read only the chunks needed for that file. No difference in correctness, small differences in overhead.

Memory usage on a large repository

RAM usage is where tools diverge most on large repositories. The index has to fit in memory during backup. At 180 GB with ~2 MB average chunk size, there are roughly 90,000 chunks — each requiring a 32-byte hash + 16 bytes of location metadata = ~4.3 MB for the raw index. The actual RSS is much higher due to Go's runtime overhead, hash-map load factor, and various buffers.

Borg wins on memory because it uses a segmented cache stored on disk, not a full in-memory map. If you're running backups on a machine with limited RAM (say, a 1 GB VPS), Borg is meaningfully better. For desktop use cases the difference doesn't matter.

Integrity verification speed

ToolSpot check (5%)Full check
Frostholm28s9m 02s
restic check --read-dataN/A11m 18s
Borg check~45s13m 40s

"Spot check" reads and verifies a random 5% sample of pack files. Full check reads everything. Frostholm's full check is faster than restic and Borg primarily because pack files are read sequentially in large chunks rather than file-by-file.

Summary

If I weren't the author of Frostholm, here's what I'd tell someone choosing between these:

  • restic: best default choice. Mature, well-documented, large community, many backend options, actively maintained. Use it unless you have a specific reason not to.
  • Borg: best for memory-constrained environments and for users who want compression to actually help (it's more effective on text/code workloads than either Frostholm or restic in default config). Slower but more RAM-efficient.
  • Frostholm: best if you're specifically targeting cold storage (B2 native backend), want fast cross-file dedup, or find value in the simpler repository format. Less mature than the other two — I'd keep a restic repo as a second copy until v1.0.

All three tools are correct. Choose based on ecosystem, not benchmark numbers — the differences above won't matter for most workloads.

Benchmark scripts and raw data: github.com/e-var/frostholm/benchmarks/2025