hyperfine: benchmark lệnh dòng lệnh đúng cách thay cho một lần time
Tóm tắt
Một lần time không phải benchmark. hyperfine chạy nhiều lần, có vòng khởi động, báo trung bình ± độ lệch chuẩn, phát hiện ngoại lai, so sánh nhiều lệnh và xuất bảng markdown cho PR.
"Cách mới nhanh hơn" thường được kết luận sau một lần chạy time. Nhưng một lần đo không nói lên gì: cache ổ đĩa, CPU đang bận việc khác, JIT chưa khởi động đều làm kết quả dao động. hyperfine là công cụ benchmark cho lệnh dòng lệnh: chạy mỗi lệnh nhiều lần, có vòng khởi động, tính trung bình, độ lệch chuẩn, phát hiện giá trị ngoại lai, và so sánh nhiều lệnh với nhau bằng con số rõ ràng.

Cài đặt
brew install hyperfine # macOS
winget install hyperfine # Windows
sudo apt install hyperfine # Ubuntu/Debian
cargo install --locked hyperfine # có Rust
Cách dùng cơ bản
# Đo một lệnh
hyperfine 'npm run build'
# So sánh hai cách làm
hyperfine 'grep -r TODO src' 'rg TODO src'
# Có 3 lần chạy khởi động để làm nóng cache
hyperfine --warmup 3 'python script.py' 'pypy script.py'
Kết quả cho mỗi lệnh gồm thời gian trung bình ± độ lệch chuẩn, min/max, số lần chạy, và cuối cùng là dòng tóm tắt dạng "lệnh A nhanh hơn lệnh B x lần". hyperfine tự chọn số lần chạy (ít nhất 10 lần, nhắm tổng thời gian khoảng 3 giây) và cảnh báo khi phát hiện giá trị ngoại lai.
Tuỳ chọn quan trọng
| Tuỳ chọn | Dùng khi | Ví dụ |
|---|---|---|
--warmup N | Muốn đo với cache "nóng" | --warmup 3 |
--prepare CMD | Cần chạy lệnh trước MỖI lần đo (xoá cache, reset dữ liệu) | --prepare 'rm -rf dist' |
--runs N | Cố định số lần chạy | --runs 20 |
-L name a,b | So sánh theo danh sách tham số | -L c gcc,clang '{c} -O2 main.c' |
--parameter-scan | Quét tham số dạng số | --parameter-scan t 1 8 'make -j {t}' |
-N | Lệnh rất nhanh, bỏ qua chi phí khởi động shell | hyperfine -N 'echo hi' |
--export-markdown | Dán kết quả vào PR, tài liệu | --export-markdown bench.md |
--export-json | Lưu số liệu để vẽ biểu đồ, so sánh sau | --export-json bench.json |
Ví dụ thực tế
# Build lạnh (không cache) so với build có cache
hyperfine --prepare 'rm -rf node_modules/.cache dist' 'npm run build'
# Tìm số luồng tối ưu cho build
hyperfine --parameter-scan threads 1 8 'make -j {threads}' --export-markdown jobs.md
# So sánh hai nhánh: build binary từ mỗi nhánh rồi đo
hyperfine './bin-main --input data.csv' './bin-feature --input data.csv'
Lưu ý
- Đóng ứng dụng nặng khác khi đo; với laptop, cắm sạc để tránh CPU tự hạ xung.
- Lệnh có tác dụng phụ (ghi file, gọi API) cần
--prepaređể mỗi lần đo bắt đầu từ cùng trạng thái. - Benchmark lệnh đầu cuối, không thay thế profiler. Khi biết chậm, dùng profiler để biết chậm ở đâu.
- Thời gian dưới vài mili giây nên dùng
-N, vì chi phí khởi động shell chiếm phần lớn kết quả.
Áp dụng thế nào?
- Dev: Trước khi nói "nhanh hơn", chạy hyperfine và dán bảng markdown vào PR. Số liệu kèm độ lệch chuẩn thuyết phục hơn mọi lời giải thích.
- Tech Lead: Đặt benchmark hyperfine cho các lệnh quan trọng (build, test, CLI chính) và so sánh khi nâng cấp công cụ, đổi bundler, đổi phiên bản runtime.
- PM: Khi team đề xuất thay công cụ vì "nhanh hơn", hỏi số liệu hyperfine: nhanh hơn bao nhiêu lần, trên dữ liệu nào.
Nguồn & tham khảo
- sharkdp/hyperfine — sharkdp (GitHub)