ccusage Profile
Nearly all runtime cost lives in the Rust binary. references/rust.md covers
release builds, the branch-vs-main worktree setup, deterministic measurement,
JSON parity, and reproducing the CI performance comment.
Two habits carry across every profiling session here:
- Measure end-to-end on real logs before trusting a profile. The wins in this repository came from timing the real CLI over real Claude data; a microbenchmark answers an isolated question without predicting a CLI win.
- Re-verify
daily,weekly,monthly,session, andblocksJSON after touching aggregation order, and record in the commit message any hotspot that was measured and deliberately left alone.
Node Paths
apps/ccusage/src/cli.js resolves and spawns the platform binary, so the
JavaScript side is a startup-latency question rather than a throughput one — a
profile of it covers launcher startup, not the work the binary does:
LOG_LEVEL=0 node --cpu-prof --cpu-prof-dir /tmp/ccusage-profiles apps/ccusage/src/cli.js daily --offline --json
Nothing else here runs on node. The tools under nix/tools/ are built with
bunCli/bunNodeModules and run under Bun; scripts in apps/ccusage/scripts/
carry nix shell shebangs that pick nushell, babashka, or bun. Time those
scripts directly and profile with their own runtime's tooling rather than
NODE_OPTIONS.
Point --cpu-prof-dir outside the worktree — nothing here ignores a profiles/
directory.