Skip to main content

A high-performance local compiler cache daemon

Project description

zccache

A blazing fast cpp compiler cache

New Project

Inspired by sccache, but optimized for local-first use with aggressive file metadata caching and filesystem watching.

Performance

Benchmark: 50 C++ files, warm cache

Scenario Bare Clang sccache zccache vs sccache vs bare clang
Single-file, Cold 10.336s 17.292s 11.489s 1.5x faster 0.9x
Single-file, Warm 10.141s 1.331s 0.031s 43x faster 324x faster
Multi-file, Cold 9.898s 9.906s 10.337s 1.0x faster 1.0x
Multi-file, Warm 10.422s 9.809s 0.023s 419x faster 446x faster

Cold = first compile (empty cache). Warm = median of 5 subsequent runs. Single-file = 50 sequential clang++ -c unit.cpp invocations. Multi-file = one clang++ -c *.cpp invocation. sccache cannot cache multi-file compilations — its "warm" multi-file time is a full recompile.

Run the benchmark yourself: uv run perf

Build system integration (ninja, meson, cmake, make)

zccache is a drop-in compiler wrapper. Point your build system's compiler at zccache <real-compiler> and it handles the rest:

# meson native file
[binaries]
c = ['zccache', '/usr/bin/clang']
cpp = ['zccache', '/usr/bin/clang++']
# CMake
set(CMAKE_C_COMPILER_LAUNCHER zccache)
set(CMAKE_CXX_COMPILER_LAUNCHER zccache)

The first build (cold cache) runs at near-bare speed. Subsequent rebuilds (ninja -t clean && ninja, or touching source files) serve cached artifacts via hardlinks in under a second.

Single-roundtrip IPC: In drop-in mode, zccache sends a single CompileEphemeral message that combines session creation, compilation, and session teardown — eliminating 2 of 3 IPC roundtrips per invocation.

Session stats: Track hit rates per-build with --stats:

eval $(zccache session-start --stats --log build.log)
export ZCCACHE_SESSION_ID=...
# ... build runs ...
zccache session-stats $ZCCACHE_SESSION_ID   # query mid-build
zccache session-end $ZCCACHE_SESSION_ID     # final stats

Persistent cache: Artifacts are stored in ~/.cache/zccache/artifacts/ (or %LOCALAPPDATA%\zccache\artifacts\ on Windows) and survive daemon restarts. No need to re-warm the cache after a reboot.

Multi-file compilation (fast path)

When a build system passes multiple source files to a single compiler invocation (e.g. gcc -c a.cpp b.cpp c.cpp -o ...), zccache treats this as a fast path:

  1. Each source file is checked against the cache in parallel.
  2. Cache hits are served immediately — their .o files are written from the cache.
  3. Remaining cache misses are batched into a single compiler process, preserving the compiler's own process-reuse and memory-sharing benefits.
  4. The outputs of the batched compilation are cached individually for future hits.

This hybrid approach means the first build populates the cache per-file, and subsequent builds serve as many files as possible from cache while still letting the compiler handle misses efficiently in bulk.

Recommendation: Configure your build system to pass multiple source files per compiler invocation whenever possible. This gives zccache the best opportunity to parallelize cache lookups and minimize compiler launches.

Concurrency

The daemon uses lock-free concurrent data structures (DashMap) for artifact and metadata lookups, so parallel compilation requests from multiple build workers never serialize on a global lock.

Status

Early development — architecture and scaffolding phase.

Goals

  • Extremely fast on local machines (daemon keeps caches warm)
  • Portable across Linux, macOS, and Windows
  • Correct under heavy parallel compilation (no stale cache hits)
  • Simple deployment (single binary)

Architecture

See docs/ARCHITECTURE.md for the full system design.

Key components

Crate Purpose
zccache-cli Command-line interface (zccache binary)
zccache-daemon Daemon process (IPC server, orchestration)
zccache-core Shared types, errors, config, path utilities
zccache-protocol IPC message types and serialization
zccache-ipc Transport layer (Unix sockets / named pipes)
zccache-hash blake3 hashing and cache key computation
zccache-fscache In-memory file metadata cache
zccache-artifact Disk-backed artifact store with redb index
zccache-watcher File watcher abstraction (notify backend)
zccache-compiler Compiler detection and argument parsing
zccache-test-support Test utilities and fixtures

Building

cargo build --workspace

Testing

cargo test --workspace

Documentation

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

zccache-1.0.18-py3-none-win_amd64.whl (2.3 MB view details)

Uploaded Python 3Windows x86-64

zccache-1.0.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

zccache-1.0.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (2.3 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

zccache-1.0.18-py3-none-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

zccache-1.0.18-py3-none-macosx_10_12_x86_64.whl (2.3 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file zccache-1.0.18-py3-none-win_amd64.whl.

File metadata

  • Download URL: zccache-1.0.18-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.11

File hashes

Hashes for zccache-1.0.18-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 bb68e7225191df9c9b8793e6cee0ff7fb20d4edf6a961d69aafdead2e37b21b4
MD5 bab18964b18a4f074d5c1513e4b08bca
BLAKE2b-256 edb721f5fd4abeba4c2e43c72c1affcdc9a09109660bdea121d8d5bbc949a9b5

See more details on using hashes here.

File details

Details for the file zccache-1.0.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for zccache-1.0.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5f1abf6b4db265a51f515b611d6740525458e54638c7830f947375f63080c21b
MD5 e79006c49ede832930766dbfce5f357b
BLAKE2b-256 45dba85d3528db21fdd44a33216a703dfe00533d9d4deecd2197567eafedf6ff

See more details on using hashes here.

File details

Details for the file zccache-1.0.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for zccache-1.0.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6ce1ea38febc19d70c6b6dd832feba76ae956be1e4b85dbf821a061e5f9aa626
MD5 2e8ef0095837cc70637e29fb1125fbba
BLAKE2b-256 6a62800a4846e5097098fa8418fad5d01d6eba84a4e1efe94cb464e4b8a3e243

See more details on using hashes here.

File details

Details for the file zccache-1.0.18-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for zccache-1.0.18-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d21e47df83d20f5916dfc3ae231ea9789391185995cadc8a343525238315918
MD5 bbb4b5de7f1344e4cc9979847f7f9e1e
BLAKE2b-256 f6763318cd8f37c2a72e7a2ab04305fe92e3a6d4264b017657722b35bdf2975f

See more details on using hashes here.

File details

Details for the file zccache-1.0.18-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for zccache-1.0.18-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6aeef8f00f52db84dab2c70e96a87f1c1168a57ea977e0e840af4168f78cbd94
MD5 8e067a0edf5f578a7db85d4110761803
BLAKE2b-256 eb5cf750bc7442e2692be98722a21bb8ec73272dc92afdc77ca13d2751514ca3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page