Skip to content

XInTheDark/nerdbench

Repository files navigation

nerdbench

NerdBench is a single-binary CPU benchmark for server benchmarking.

It's essentially a Go wrapper for a bunch of test modules. These include: C-Ray, SQLite speedtest, sysbench CPU, Stockfish, OpenSSL speed, zstd, ggml ML kernel, and TinyCC compile. They are embedded inside the binary so you don't have to build anything.

NerdBench reports both single-core and multi-core scores. It can also write detailed results to a json file, allowing you to use it in other scripts.

The scores are currently calibrated based on Ryzen 9 9950X, 4 cores. (Baseline: 1000)

one liner to run

curl -fsSL https://raw.githubusercontent.com/XInTheDark/nerdbench/main/bench.sh | sh

to write results to a file:

curl -fsSL https://raw.githubusercontent.com/XInTheDark/nerdbench/main/bench.sh | sh -s -- --format json -o /tmp/nerdbench.json

Profiles

use with --profile

Profile Target Runtime Description
smoke < 1 minute Quick CI validation with minimal workloads
quick ~ 1-2 minutes Short benchmark run
standard ~ 5 minutes Full benchmark suite (default)
extended ~ 20 minutes Extended workloads for thorough testing

JSON Output

The JSON result schema (version 1) contains:

  • status: "ok" or "failed"
  • scores.single / scores.multi: geometric mean of successful test module subscores
  • benchmarks[]: per-test-module results with status, metric, score
  • errors[]: error entries for failed test modules
  • provenance: baseline hash and per-worker source, revision, license, SHA256

A failed test module appears in benchmarks[] with status: "failed" and no score, and is also listed in errors[].

Build Workers

scripts/build-workers.sh
go run ./cmd/nerdbench run --profile smoke --bench c-ray

scripts/build-workers.sh fetches third-party sources, builds worker binaries for the native host target, verifies Linux workers are self-contained, and generates embedded asset registration under internal/assets/.

Cross-Build (Linux)

scripts/build-workers.sh   # native build for local target
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o dist/nerdbench-linux-amd64 ./cmd/nerdbench
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o dist/nerdbench-linux-arm64 ./cmd/nerdbench

Worker binaries must be built in a native environment for their target OS/arch. The release workflow uses QEMU-backed Linux arm64 containers for arm64 workers instead of cross-labeling host-built artifacts.

Calibration

scripts/bench.sh --profile smoke --format json --progress none -o /tmp/nerdbench-run-001.json
scripts/calibrate.sh --score-version 2026-06-07-dev --result /tmp/nerdbench-run-001.json
scripts/calibrate.sh --score-version 2026-06-07-dev --result /tmp/nerdbench-run-001.json --set-baseline

Run NerdBench separately to create one or more JSON result files, then pass those files to scripts/calibrate.sh with --result. Generated baseline candidates are written to calibration/baselines/<score_version>.json. --set-baseline copies the generated candidate into internal/results/baselines/<score_version>.json if it does not already exist.


NerdBench is licensed under GPL-3.0-or-later. However, if you want to use it in a non-GPL-compatible script, you can still call NerdBench as a separate (external) GPL program and parse its output.

About

Open source, single-binary CPU benchmark (Geekbench alternative)

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors