Files
lix/bench
gilice 765cd3823a bench: rewrite in python, add instruction count profiling
This is to some extent a simple transliteration of bench.sh, but also
adds some additional features:
- the ability to select which benchmarks to run, instead of having to
  run all at once (via --cases option)
- help text (--help), and argument parsing
- ability to profile instruction counts (via --mode icount).
Instruction count is a stable metric, that correlates to the execution
time, but is less affected by the environment (like other heavy programs
running, or the system hardware).
Other projects (most notably rustc) use instruction count as a primary target metric.

Change-Id: I791cac499e64983efb8bcd4ea1faef13ded09ee6
2025-03-14 19:24:21 +01:00
..
2024-04-08 19:50:24 -07:00

Benchmarking scripts for Lix

These are very much WIP, and have a few clumsy assumptions that we would somewhat rather be fixed, but we have committed them to let others be able to do benchmarking in the mean time.

Benchmarking procedure

Build some Lixes you want to compare, by whichever means you wish.

Get a computer that is not busy and strongly preferably is bare-metal or at least not a cloud VM (e.g. go make coffee when running benchmarks).

From the root of a Lix checkout, run ./bench/bench.sh resultlink-one resultlink-two, where resultlink-one and resultlink-two are the result links from the builds you want to test (they can be any directory with bin/nix in it, however).

To get the summary again, run ./bench/summarize.jq bench/bench-*.json.

Example results

(vim tip: :r !bench/summarize.jq bench/bench-*.json to dump it directly into your editor)

result-asserts/bin/nix --extra-experimental-features 'nix-command flakes' search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6
c6fe19ccb59cac54b5b3f25e160870 hello
  mean:     15.993s ± 0.081s
            user: 13.321s | system: 1.865s
  median:   15.994s
  range:    15.829s ... 16.096s
  relative: 1
result/bin/nix --extra-experimental-features 'nix-command flakes' search --no-eval-cache github:nixos/nixpkgs/e1fa12d4f6c6fe19cc
b59cac54b5b3f25e160870 hello
  mean:     15.897s ± 0.075s
            user: 13.248s | system: 1.843s
  median:   15.88s
  range:    15.807s ... 16.047s
  relative: 0.994

---

result/bin/nix --extra-experimental-features 'nix-command flakes' eval -f bench/nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix
  mean:     0.4s ± 0.024s
            user: 0.335s | system: 0.046s
  median:   0.386s
  range:    0.379s ... 0.43s
  relative: 1

result-asserts/bin/nix --extra-experimental-features 'nix-command flakes' eval -f bench/nixpkgs/pkgs/development/haskell-modules/hackage-packages.nix
  mean:     0.404s ± 0.024s
            user: 0.338s | system: 0.046s
  median:   0.386s
  range:    0.384s ... 0.436s
  relative: 1.008

---

result-asserts/bin/nix --extra-experimental-features 'nix-command flakes' eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
  mean:     5.838s ± 0.023s
            user: 5.083s | system: 0.464s
  median:   5.845s
  range:    5.799s ... 5.867s
  relative: 1

result/bin/nix --extra-experimental-features 'nix-command flakes' eval --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
  mean:     5.788s ± 0.044s
            user: 5.056s | system: 0.439s
  median:   5.79s
  range:    5.715s ... 5.876s
  relative: 0.991

---

GC_INITIAL_HEAP_SIZE=10g result-asserts/bin/nix eval --extra-experimental-features 'nix-command flakes' --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
  mean:     4.147s ± 0.021s
            user: 3.457s | system: 0.487s
  median:   4.147s
  range:    4.123s ... 4.195s
  relative: 1

GC_INITIAL_HEAP_SIZE=10g result/bin/nix eval --extra-experimental-features 'nix-command flakes' --raw --impure --expr 'with import <nixpkgs/nixos> {}; system'
  mean:     4.149s ± 0.027s
            user: 3.483s | system: 0.456s
  median:   4.142s
  range:    4.126s ... 4.215s
  relative: 1

---