Skip to content

What will header maintenance cost?

A check adds its measured runtime to a serial development workflow. A full year refresh takes the repair time below when every selected file has an eligible stale header. Missing or conflicting headers still need review. Select a chart to view it at full size.

Each panel has its own vertical scale starting at zero. Bar heights show the relative gap at that codebase size; labels show median time in milliseconds.

How much waiting does a check add?

Native check latency across codebase sizes

For 10,000 mixed-language files, a routine check adds 36 ms in this run: 0.36% on top of a 10-second serial workflow. A check reporting 10,000 stale headers takes 62 ms.

Task Previous LMH LMH now HawkEye 7.2.0
Routine check 120 ms 36 ms 76 ms
Check stale headers 134 ms 62 ms 76 ms
Repair stale years 428 ms 147 ms 125 ms

For your workflow, use check time / existing workflow time × 100 to estimate the percentage added. The generated HTML report lets you enter your own duration. Installation, hook orchestration and CI queueing are outside these measurements.

How long will an entire codebase take to fix?

Time to repair stale years across a codebase

Repairing stale years in all 10,000 files takes 147 ms, down from 428 ms in the previous LMH. HawkEye takes 125 ms: LMH wins the two check cases here; its repair median remains 17.6% slower.

Both tools get the same CPU budget. LMH uses up to four available workers for trees of at least 256 files. LMH keeps year-only edits, exact-byte/identity revalidation, mode preservation, atomic replacement and file sync. HawkEye formats a fixed leading template and writes directly. These guarantees differ; the comparison measures the stated tasks rather than equivalent feature sets. CPU limits and filesystem write costs can change the ranking.

An earlier control with the same binary hashes restricted both tools to one CPU: stale checks took 111.3 ms for LMH versus 74.9 ms for HawkEye, and repairs took 289.1 versus 121.9 ms. On the workspace overlay filesystem, 1,000-file repairs took 165.5 versus 38.6 ms; its backing hardware is unspecified. That earlier Python-based audit uses five timings and three RSS runs after warmup. See the CPU and storage results for all three tasks.

How much memory does it need?

Peak native process memory across languages

Memory is peak native-process RSS, excluding the benchmark driver and compilation. Worker threads increase check memory; planning edits before allocating replacement bytes reduces repair memory compared with previous LMH.

All nine languages

LMH medians for a separate 1,000-file tree in each language:

Language Routine check Stale-header check Repair all stale years
Python 6 ms 9 ms 17 ms
JavaScript 6 ms 10 ms 17 ms
TypeScript 7 ms 9 ms 17 ms
Rust 6 ms 9 ms 16 ms
Go 6 ms 10 ms 17 ms
Swift 6 ms 10 ms 17 ms
Bash 6 ms 9 ms 16 ms
C 6 ms 9 ms 14 ms
C++ 7 ms 10 ms 17 ms

Method and recorded environment

Recorded 2026-10-02 UTC from source 59c4782 versus previous source 8d72bf1 and locally built HawkEye 7.2.0. All use Rust 1.93.0 and locked release builds; LMH uses thin LTO, HawkEye its upstream release defaults. The shared runner is Linux x86_64, glibc 2.41, AMD EPYC 9V74. Fixtures use RAM-backed /tmp (tmpfs): 1 KiB/file, mixing all nine languages. These measurements cover the source CLI, rather than the published 0.6.0 wheel.

Five timings per case follow one discarded warmup. Bash measures wall time with millisecond precision; medians below 10 ms have limited resolution. Tool order rotates and reverses deterministically; every timing launches a fresh native CLI. Peak RSS is the maximum of five separate GNU time invocations on restored fixtures. Generation, restoration, validation and plotting stay outside timing. Each run verifies exit status, checked counts, findings and final source SHA-256 hashes. Both tools receive identical code statements, equal file counts/sizes, owner, license and years, using their accepted comment separators. HawkEye's Git attributes are disabled. Every findings/repair case has stale years in all files.

These are synthetic sources with warm filesystem caches and no persistent result cache. They are examples of workflow costs on one shared runner; results vary by hardware, file sizes, language mix and storage. Use your codebase's filesystem before estimating disk repair time.

Summary CSV · 10,000-file comparison samples · Versions, binary hashes and environment

Reproduce

From a checkout on Linux or macOS (Windows: WSL), install Git, the pinned Rust toolchain and a native linker. The driver uses Bash, jq, gnuplot and GNU time:

# Debian/Ubuntu
sudo apt install jq gnuplot-nox time
# macOS
brew install jq gnuplot gnu-time
cargo install hawkeye --version 7.2.0 --locked --root target/hawkeye
bash scripts/benchmark.sh --compare target/hawkeye/bin/hawkeye

The script builds the locked release CLI, measures all nine languages and mixed trees at 1, 100, 1,000 and 10,000 files, and writes CSVs, SVG/PNG charts and a standalone target/bench/report.html with embedded charts. Open that report to explore the slowdown for your workflow duration. Mixed cases below nine files are skipped.

To include the previous LMH implementation used in this snapshot:

git fetch origin 8d72bf1b81167a1e43e0e54e350e4e2351306bde
git worktree add --detach /tmp/lmh-baseline 8d72bf1
cargo build --release --locked --manifest-path /tmp/lmh-baseline/Cargo.toml --target-dir /tmp/lmh-baseline/target --bin lmh
bash scripts/benchmark.sh --baseline /tmp/lmh-baseline/target/release/lmh --compare target/hawkeye/bin/hawkeye

Use --files 1 100 --runs 3 for a quick run, --bytes 16384 for larger sources, or --binary /path/to/lmh for another native build. Set TMPDIR to an existing directory on your codebase's filesystem to include its write costs. On Linux, prefix the benchmark command with taskset -c CPU using one allowed CPU to compare both tools on one CPU. --help lists all options.

Charts and the archived report and data are browser uploads on PR #103. Only small CSVs and environment metadata live in Git. The benchmark workflow saves GitHub Actions artifacts. PR runs render committed data and include every CSV and JSON evidence file. Manual runs measure the full suite; the optional release tag selects an existing version. Actions artifacts expire. To keep results, download the artifact and upload it through the PR's browser uploader. Benchmark runs do not create releases or upload release assets.