Luigit
repositories / bugabinga.net

bugabinga.net

personal infrastructure for bugabinga!

owned by admin

services/luci/PERFORMANCE.md

Raw
Rendered preview

Luci performance

internal/web/perf_test.go benchmarks deterministic dashboard and run views.

Fixtures contain 120 runs × 2 children for small, 1,000 runs × 4 children for medium, one pending run, and one active child.

Method

Build baseline and candidate test binaries from their respective source revisions.

Run each binary with GOMAXPROCS=1, -run '^$', -bench '^(BenchmarkBuildDashboard|BenchmarkBuildRun)$', -benchtime=3s, and -count=1.

Alternate binary order over 15 batches, appending each binary's output to separate files.

Compare files with go tool benchstat baseline.txt candidate.txt.

A standalone candidate measurement is runnable with:

GOMAXPROCS=1 go test ./internal/web -run '^$' -bench '^(BenchmarkBuildDashboard|BenchmarkBuildRun)$' -benchtime=3s -count=15 > target/luci-perf/candidate.txt
go tool benchstat target/luci-perf/baseline.txt target/luci-perf/candidate.txt

Profiles use the same environment with one medium benchmark, -benchtime=15s, -cpuprofile, and -memprofile.

2026-09-27 short-ID result

Hardware: AMD Ryzen 5 5600X, 12 logical CPUs, 31 GiB RAM, CachyOS Linux 7.2.7-1-cachyos x86_64.

Runtime: Go 1.27.1-X:nodwarf5, GOMAXPROCS=1.

benchmark baseline median candidate median time change p, n
dashboard/small 18.279 ms ±2% 0.509 ms ±2% -97.21% <0.001, 15
dashboard/medium 1,092.512 ms ±1% 4.803 ms ±1% -99.56% <0.001, 15
run/small 18.099 ms ±1% 0.247 ms ±1% -98.64% <0.001, 15
run/medium 1,099.809 ms ±2% 2.306 ms ±1% -99.79% <0.001, 15

benchstat intervals are 95% confidence intervals.

Candidate timing coefficient of variation was 1.08-2.17% versus 1.28-3.46% for baseline.

Medium dashboard allocation changed from 177.081 MiB and 20.088M allocs/op to 3.749 MiB and 19.38k allocs/op.

Medium run allocation changed from 178,361.6 KiB and 20.074M allocs/op to 869.1 KiB and 5.240k allocs/op.

The change encodes each run ID once, counts usable proquint block prefixes once, and counts usable revision prefixes once.

This preserves aliases whose distinct input IDs parse to the same value, because every distinct ID still increments the shared rendered-prefix count.

Benchmarks cover in-memory view construction, not disk reads, Git access, log decompression, template rendering, HTTP latency, or CI job throughput. No timing or allocation regression was detected in the four measured cases. The initial baseline batch was slower than the alternating control, so reported comparisons use only the alternating batches. Results are local measurements under ordinary machine load, not a cross-machine performance guarantee.

# Luci performance

`internal/web/perf_test.go` benchmarks deterministic dashboard and run views.

Fixtures contain 120 runs × 2 children for `small`, 1,000 runs × 4 children for `medium`, one pending run, and one active child.

## Method

Build baseline and candidate test binaries from their respective source revisions.

Run each binary with `GOMAXPROCS=1`, `-run '^$'`, `-bench '^(BenchmarkBuildDashboard|BenchmarkBuildRun)$'`, `-benchtime=3s`, and `-count=1`.

Alternate binary order over 15 batches, appending each binary's output to separate files.

Compare files with `go tool benchstat baseline.txt candidate.txt`.

A standalone candidate measurement is runnable with:

```sh
GOMAXPROCS=1 go test ./internal/web -run '^$' -bench '^(BenchmarkBuildDashboard|BenchmarkBuildRun)$' -benchtime=3s -count=15 > target/luci-perf/candidate.txt
go tool benchstat target/luci-perf/baseline.txt target/luci-perf/candidate.txt
```

Profiles use the same environment with one `medium` benchmark, `-benchtime=15s`, `-cpuprofile`, and `-memprofile`.

## 2026-09-27 short-ID result

Hardware: AMD Ryzen 5 5600X, 12 logical CPUs, 31 GiB RAM, CachyOS Linux 7.2.7-1-cachyos x86_64.

Runtime: Go 1.27.1-X:nodwarf5, `GOMAXPROCS=1`.

| benchmark | baseline median | candidate median | time change | p, n |
| --- | ---: | ---: | ---: | --- |
| dashboard/small | 18.279 ms ±2% | 0.509 ms ±2% | -97.21% | <0.001, 15 |
| dashboard/medium | 1,092.512 ms ±1% | 4.803 ms ±1% | -99.56% | <0.001, 15 |
| run/small | 18.099 ms ±1% | 0.247 ms ±1% | -98.64% | <0.001, 15 |
| run/medium | 1,099.809 ms ±2% | 2.306 ms ±1% | -99.79% | <0.001, 15 |

`benchstat` intervals are 95% confidence intervals.

Candidate timing coefficient of variation was 1.08-2.17% versus 1.28-3.46% for baseline.

Medium dashboard allocation changed from 177.081 MiB and 20.088M allocs/op to 3.749 MiB and 19.38k allocs/op.

Medium run allocation changed from 178,361.6 KiB and 20.074M allocs/op to 869.1 KiB and 5.240k allocs/op.

The change encodes each run ID once, counts usable proquint block prefixes once, and counts usable revision prefixes once.

This preserves aliases whose distinct input IDs parse to the same value, because every distinct ID still increments the shared rendered-prefix count.

Benchmarks cover in-memory view construction, not disk reads, Git access, log decompression, template rendering, HTTP latency, or CI job throughput.
No timing or allocation regression was detected in the four measured cases.
The initial baseline batch was slower than the alternating control, so reported comparisons use only the alternating batches.
Results are local measurements under ordinary machine load, not a cross-machine performance guarantee.