From 54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4 Mon Sep 17 00:00:00 2001 From: James Joseph Date: Sat, 12 Sep 2026 17:42:44 -0500 Subject: [PATCH 1/4] chore: upgrade Gonum fork to v0.19.0-fork --- .github/workflows/ci.yml | 2 +- README.md | 2 +- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 327e1a1..4725a66 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: go mod init example.com/controlsys-consumer go mod edit -require=github.com/jamestjsp/controlsys@v0.0.0 go mod edit -replace=github.com/jamestjsp/controlsys="$GITHUB_WORKSPACE" - go mod edit -replace=gonum.org/v1/gonum=github.com/jamestjsp/gonum@v0.17.3-fork + go mod edit -replace=gonum.org/v1/gonum=github.com/jamestjsp/gonum@v0.19.0-fork cat > controlsys_consumer_test.go <<'EOF' package controlsysconsumer diff --git a/README.md b/README.md index dffc6ad..0aa18bc 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ go get github.com/jamestjsp/controlsys > **Note:** This package depends on a [gonum fork](https://github.com/jamestjsp/gonum) for additional LAPACK routines. Because `replace` directives do not propagate to downstream modules, applications that import `controlsys` must add this to their own `go.mod`: > ``` -> replace gonum.org/v1/gonum => github.com/jamestjsp/gonum v0.17.3-fork +> replace gonum.org/v1/gonum => github.com/jamestjsp/gonum v0.19.0-fork > ``` ## Production Readiness diff --git a/go.mod b/go.mod index b560322..feef149 100644 --- a/go.mod +++ b/go.mod @@ -4,4 +4,4 @@ go 1.26.3 require gonum.org/v1/gonum v0.15.0 -replace gonum.org/v1/gonum => github.com/jamestjsp/gonum v0.17.7-fork +replace gonum.org/v1/gonum => github.com/jamestjsp/gonum v0.19.0-fork diff --git a/go.sum b/go.sum index 5b429a6..62d350b 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ -github.com/jamestjsp/gonum v0.17.7-fork h1:evxkama96reFIjJEZiHYhRGtibxK4d076+3vB/Q0t+c= -github.com/jamestjsp/gonum v0.17.7-fork/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= +github.com/jamestjsp/gonum v0.19.0-fork h1:HoyJewH8DzHgZsgouf2uRZQcigijbXJ5B62mAb57Xgo= +github.com/jamestjsp/gonum v0.19.0-fork/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= From 17753c3647bc8414a52c9777942bd022b9334ca2 Mon Sep 17 00:00:00 2001 From: James Joseph Date: Sat, 12 Sep 2026 18:03:59 -0500 Subject: [PATCH 2/4] chore: address Gonum upgrade review with local pin and benchmarks --- .codex/environments/environment.toml | 2 +- docs/benchmarks/gonum-v0.19.0/README.md | 106 +++ .../gonum-v0.19.0/focused-baseline.txt.gz | Bin 0 -> 2275 bytes .../gonum-v0.19.0/focused-benchstat.txt | 64 ++ .../gonum-v0.19.0/focused-candidate.txt.gz | Bin 0 -> 2267 bytes .../gonum-v0.19.0/full-baseline.txt.gz | Bin 0 -> 29639 bytes .../gonum-v0.19.0/full-benchstat.txt | 727 ++++++++++++++++++ .../gonum-v0.19.0/full-candidate.txt.gz | Bin 0 -> 29572 bytes docs/benchmarks/gonum-v0.19.0/metadata.json | 128 +++ .../gonum-v0.19.0/subcase-baseline.txt.gz | Bin 0 -> 293 bytes .../gonum-v0.19.0/subcase-benchstat.txt | 16 + .../gonum-v0.19.0/subcase-candidate.txt.gz | Bin 0 -> 303 bytes 12 files changed, 1042 insertions(+), 1 deletion(-) create mode 100644 docs/benchmarks/gonum-v0.19.0/README.md create mode 100644 docs/benchmarks/gonum-v0.19.0/focused-baseline.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/focused-benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/focused-candidate.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/full-baseline.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/full-benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/full-candidate.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/metadata.json create mode 100644 docs/benchmarks/gonum-v0.19.0/subcase-baseline.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/subcase-benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/subcase-candidate.txt.gz diff --git a/.codex/environments/environment.toml b/.codex/environments/environment.toml index 4602347..34450d0 100644 --- a/.codex/environments/environment.toml +++ b/.codex/environments/environment.toml @@ -86,7 +86,7 @@ cd "$tmp" go mod init example.com/controlsys-consumer go mod edit -require=github.com/jamestjsp/controlsys@v0.0.0 go mod edit -replace=github.com/jamestjsp/controlsys="$repo_path" -go mod edit -replace=gonum.org/v1/gonum=github.com/jamestjsp/gonum@v0.17.3-fork +go mod edit -replace=gonum.org/v1/gonum=github.com/jamestjsp/gonum@v0.19.0-fork cat > controlsys_consumer_test.go <<'EOF' package controlsysconsumer diff --git a/docs/benchmarks/gonum-v0.19.0/README.md b/docs/benchmarks/gonum-v0.19.0/README.md new file mode 100644 index 0000000..dbab2dc --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/README.md @@ -0,0 +1,106 @@ +# Gonum v0.19.0-fork upgrade: performance evidence + +Measured on 2026-09-12 for PR #171. The upgrade has mixed performance on this +machine. The complete 236-case timing geomean improves 0.75%, but reproducible +slowdowns remain. This is not a regression-free performance approval. Assess the +tradeoff or repair the affected backend paths before merging and publishing the +prepared v1.5.1 release. + +## Comparison + +- Baseline: `fdda4f150d13b34a969de7faed6ae896e827ce94`, Gonum `v0.17.7-fork`. +- Candidate: `54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4`, Gonum `v0.19.0-fork`. +- The baseline was the exact PR parent and freshly fetched `origin/main`. +- Apple M1 Pro, darwin/arm64, Go 1.26.4, `GOMAXPROCS=8`. +- Default Gonum Go BLAS and LAPACK implementations; no backend overrides, + custom build tags, GOFLAGS, or PGO profiles. Native compilation, no emulation. +- Same unchanged benchmark fixtures on both revisions. Both test binaries were + built before timing. No agent builds, tests, or profiling ran concurrently. + This was a normal desktop host, without CPU affinity or power-state control. +- Ten samples per case per revision, alternating baseline/candidate and + candidate/baseline order. Full suite: 100ms per benchmark; focused checks: + 300ms. All benchmark processes exited successfully with matching case sets. +- `benchstat`: `golang.org/x/perf v0.0.0-20260312031701-16a31bc5fbd0`. + +## Results + +The longer follow-up covered the 14 full-sweep slowdowns of at least 3%, plus +DC motor simulation, regulator construction, and Lyapunov allocation behavior. +One nested benchmark needed a separate slash-separated selection. Medians below +come from the longer samples; all listed changes have p < 0.001, except the +10,000-point SISO FRD case (p=0.009). Full tables include confidence intervals. + +| Benchmark | Baseline | Candidate | Time change | +| --- | ---: | ---: | ---: | +| MatLog_N50 | 330.3 us | 372.0 us | +12.62% | +| D2C_ZOH_N50 | 413.3 us | 454.3 us | +9.92% | +| Stabsep_N100 | 8.904 ms | 9.455 ms | +6.18% | +| SystemFRD_SISO_10000 | 220.2 us | 233.7 us | +6.15% | +| Reduce | 45.94 us | 48.43 us | +5.42% | +| Modsep_N50 | 1.429 ms | 1.504 ms | +5.29% | +| Stabsep_N50 | 1.385 ms | 1.458 ms | +5.27% | +| DiscretizeZOH | 21.48 us | 22.58 us | +5.15% | +| MatLog_N20 | 49.37 us | 51.78 us | +4.88% | +| ControllabilityStaircase | 36.36 us | 37.94 us | +4.36% | +| D2C_ZOH_N20 | 61.47 us | 63.94 us | +4.02% | +| Canon_Modal_N50 | 640.5 us | 660.9 us | +3.19% | +| Stabsep_N10 | 32.70 us | 33.47 us | +2.37% | +| Simulate_DCMotor | 46.69 us | 39.72 us | -14.93% | +| Reg_N100_M5_P5 | 79.72 us | 60.92 us | -23.58% | + +The `FrequencySweepKernels/N4_W2/TransferFunction` slowdown did not reproduce +with longer samples (p=0.447). Lyap_N100 timing was inconclusive (p=0.353). +Absence of statistical significance does not establish equivalence. The full +sweep contains additional smaller changes; see its complete table rather than +using this selected follow-up as an aggregate performance score. Multiple case +comparisons can produce false positives, especially for small effects. + +Allocations also vary: DC motor simulation drops from 45 to 11 allocs/op and +regulator construction from 55 to 25. The focused SISO FRD case rises from 60 to +61, and Stabsep_N100 from 481 to 482. Lyap_N100's full-sweep increase from 363 to +364 did not reproduce in the focused run (both medians 363), although its bytes +per operation increased 0.08%. Tables retain all memory measurements. + +These data establish behavior only on this host at eight workers. They do not +establish performance on amd64, other worker counts, or arbitrary models, and do +not attribute a specific backend change as the cause. Correctness tests and race +tests passed separately; performance measurements do not replace those tests. + +## Evidence and reproduction + +- `full-benchstat.txt`: all 236 cases, timing and allocations. +- `focused-benchstat.txt`: 16 longer follow-up cases. +- `subcase-benchstat.txt`: the nested transfer-function follow-up. +- Matching `*-baseline.txt.gz` and `*-candidate.txt.gz`: complete raw samples. +- `metadata.json`: full-sweep binary hashes, flags, environment, and run order. + +From the repository, build isolated copies of the exact revisions, then run the +existing Go benchmarks. Prebuilding is equivalent to `go test -run '^$' +-bench=. -benchmem -benchtime=100ms -count=1`, with compilation outside timing. + +```bash +set -eu +bench_dir=$(mktemp -d) +mkdir "$bench_dir/baseline" "$bench_dir/candidate" +git archive fdda4f150d13b34a969de7faed6ae896e827ce94 | tar -x -C "$bench_dir/baseline" +git archive 54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4 | tar -x -C "$bench_dir/candidate" +(cd "$bench_dir/baseline" && go test -c -o "$bench_dir/baseline.test") +(cd "$bench_dir/candidate" && go test -c -o "$bench_dir/candidate.test") +export GOMAXPROCS=8 +for round in $(seq 1 10); do + order='baseline candidate' + if [ $((round % 2)) -eq 0 ]; then order='candidate baseline'; fi + for label in $order; do + "$bench_dir/$label.test" -test.run='^$' -test.bench=. \ + -test.benchmem -test.benchtime=100ms -test.count=1 \ + >> "$bench_dir/$label.txt" + done +done +benchstat "$bench_dir/baseline.txt" "$bench_dir/candidate.txt" +``` + +For focused reproduction, use 300ms and select the top-level names in +`focused-benchstat.txt` with `^Benchmark(Name1|Name2|...)$`. For the nested case, +use `^BenchmarkFrequencySweepKernels$/^N4_W2$/^TransferFunction$` separately. +To reanalyze retained data, decompress each pair with `gzip -dc` and pass the +resulting files to the recorded benchstat version. diff --git a/docs/benchmarks/gonum-v0.19.0/focused-baseline.txt.gz b/docs/benchmarks/gonum-v0.19.0/focused-baseline.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..7729376d202f41c5be9c75837eaa592b68af4f6e GIT binary patch literal 2275 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 literal 0 HcmV?d00001 diff --git a/docs/benchmarks/gonum-v0.19.0/focused-benchstat.txt b/docs/benchmarks/gonum-v0.19.0/focused-benchstat.txt new file mode 100644 index 0000000..0a43076 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/focused-benchstat.txt @@ -0,0 +1,64 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro + │ baseline.txt │ candidate.txt │ + │ sec/op │ sec/op vs base │ +Reduce-8 45.94µ ± 1% 48.43µ ± 7% +5.42% (p=0.000 n=10) +DiscretizeZOH-8 21.48µ ± 1% 22.58µ ± 6% +5.15% (p=0.000 n=10) +ControllabilityStaircase-8 36.36µ ± 2% 37.94µ ± 3% +4.36% (p=0.000 n=10) +Simulate_DCMotor-8 46.69µ ± 1% 39.72µ ± 2% -14.93% (p=0.000 n=10) +Lyap_N100-8 4.052m ± 1% 4.048m ± 0% ~ (p=0.353 n=10) +Reg_N100_M5_P5-8 79.72µ ± 7% 60.92µ ± 2% -23.58% (p=0.000 n=10) +D2C_ZOH_N20-8 61.47µ ± 1% 63.94µ ± 1% +4.02% (p=0.000 n=10) +D2C_ZOH_N50-8 413.3µ ± 1% 454.3µ ± 1% +9.92% (p=0.000 n=10) +MatLog_N20-8 49.37µ ± 1% 51.78µ ± 1% +4.88% (p=0.000 n=10) +MatLog_N50-8 330.3µ ± 1% 372.0µ ± 3% +12.62% (p=0.000 n=10) +SystemFRD_SISO_10000-8 220.2µ ± 6% 233.7µ ± 3% +6.15% (p=0.009 n=10) +Canon_Modal_N50-8 640.5µ ± 1% 660.9µ ± 2% +3.19% (p=0.000 n=10) +Stabsep_N10-8 32.70µ ± 1% 33.47µ ± 1% +2.37% (p=0.000 n=10) +Stabsep_N50-8 1.385m ± 1% 1.458m ± 3% +5.27% (p=0.000 n=10) +Stabsep_N100-8 8.904m ± 2% 9.455m ± 4% +6.18% (p=0.000 n=10) +Modsep_N50-8 1.429m ± 3% 1.504m ± 3% +5.29% (p=0.000 n=10) +geomean 213.2µ 217.1µ +1.84% + + │ baseline.txt │ candidate.txt │ + │ B/op │ B/op vs base │ +Reduce-8 52.43Ki ± 0% 52.44Ki ± 0% +0.02% (p=0.002 n=10) +DiscretizeZOH-8 21.67Ki ± 0% 21.67Ki ± 0% ~ (p=0.696 n=10) +ControllabilityStaircase-8 22.16Ki ± 0% 22.15Ki ± 0% ~ (p=0.126 n=10) +Simulate_DCMotor-8 19.67Ki ± 0% 16.28Ki ± 0% -17.22% (p=0.000 n=10) +Lyap_N100-8 373.0Ki ± 0% 373.3Ki ± 0% +0.08% (p=0.000 n=10) +Reg_N100_M5_P5-8 424.2Ki ± 0% 421.4Ki ± 0% -0.66% (p=0.000 n=10) +D2C_ZOH_N20-8 77.60Ki ± 1% 77.40Ki ± 0% -0.25% (p=0.035 n=10) +D2C_ZOH_N50-8 463.5Ki ± 0% 463.2Ki ± 0% ~ (p=0.218 n=10) +MatLog_N20-8 64.54Ki ± 0% 64.50Ki ± 0% ~ (p=0.954 n=10) +MatLog_N50-8 391.2Ki ± 0% 391.8Ki ± 0% +0.16% (p=0.007 n=10) +SystemFRD_SISO_10000-8 922.6Ki ± 0% 922.6Ki ± 0% +0.01% (p=0.000 n=10) +Canon_Modal_N50-8 209.7Ki ± 0% 211.0Ki ± 0% +0.58% (p=0.001 n=10) +Stabsep_N10-8 29.33Ki ± 0% 29.32Ki ± 0% ~ (p=0.288 n=10) +Stabsep_N50-8 635.1Ki ± 0% 635.4Ki ± 0% ~ (p=0.796 n=10) +Stabsep_N100-8 2.528Mi ± 0% 2.532Mi ± 0% ~ (p=0.218 n=10) +Modsep_N50-8 640.9Ki ± 0% 640.3Ki ± 0% ~ (p=0.218 n=10) +geomean 168.6Ki 166.6Ki -1.18% + + │ baseline.txt │ candidate.txt │ + │ allocs/op │ allocs/op vs base │ +Reduce-8 170.0 ± 0% 170.0 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeZOH-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +ControllabilityStaircase-8 109.0 ± 0% 109.0 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 45.00 ± 0% 11.00 ± 0% -75.56% (p=0.000 n=10) +Lyap_N100-8 363.0 ± 0% 363.0 ± 0% ~ (p=0.474 n=10) +Reg_N100_M5_P5-8 55.00 ± 0% 25.00 ± 0% -54.55% (p=0.000 n=10) +D2C_ZOH_N20-8 50.00 ± 0% 50.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N50-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N20-8 30.00 ± 0% 30.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N50-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_10000-8 60.00 ± 2% 61.00 ± 0% +1.67% (p=0.001 n=10) +Canon_Modal_N50-8 112.0 ± 0% 112.0 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N10-8 79.00 ± 0% 79.00 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N50-8 156.0 ± 1% 156.0 ± 0% ~ (p=0.211 n=10) +Stabsep_N100-8 481.0 ± 0% 482.0 ± 0% +0.21% (p=0.002 n=10) +Modsep_N50-8 143.0 ± 1% 143.0 ± 0% ~ (p=0.087 n=10) +geomean 84.50 73.74 -12.73% +¹ all samples are equal diff --git a/docs/benchmarks/gonum-v0.19.0/focused-candidate.txt.gz b/docs/benchmarks/gonum-v0.19.0/focused-candidate.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..0cea882c240baade1484245bf6c7ce81d9b5dcb7 GIT binary patch literal 2267 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 literal 0 HcmV?d00001 diff --git a/docs/benchmarks/gonum-v0.19.0/full-benchstat.txt b/docs/benchmarks/gonum-v0.19.0/full-benchstat.txt new file mode 100644 index 0000000..0d5f651 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/full-benchstat.txt @@ -0,0 +1,727 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro + │ baseline.txt │ candidate.txt │ + │ sec/op │ sec/op vs base │ +SimulateWithDelay_SISO-8 19.76µ ± 1% 20.05µ ± 2% +1.44% (p=0.023 n=10) +SimulateWithDelay_MIMO-8 111.2µ ± 2% 110.3µ ± 1% ~ (p=0.063 n=10) +BilinearDiscretize-8 10.61µ ± 2% 10.72µ ± 2% ~ (p=0.123 n=10) +TransferFunction_MIMO-8 62.16µ ± 2% 63.11µ ± 1% ~ (p=0.165 n=10) +Reduce-8 46.66µ ± 2% 48.66µ ± 1% +4.28% (p=0.000 n=10) +AbsorbDelay-8 1.081µ ± 3% 1.101µ ± 4% ~ (p=0.123 n=10) +DiscretizeZOH-8 21.59µ ± 2% 22.53µ ± 1% +4.36% (p=0.000 n=10) +DenseNorm-8 849.2n ± 1% 845.7n ± 0% ~ (p=0.143 n=10) +Series-8 1.326µ ± 4% 1.296µ ± 3% ~ (p=0.159 n=10) +Parallel-8 816.6n ± 8% 780.8n ± 12% ~ (p=0.280 n=10) +Feedback-8 4.501µ ± 2% 4.580µ ± 2% +1.74% (p=0.037 n=10) +FeedbackLFT-8 17.76µ ± 5% 17.48µ ± 4% ~ (p=0.971 n=10) +Append-8 954.5n ± 5% 919.8n ± 8% ~ (p=0.225 n=10) +FreqResponse-8 38.67µ ± 1% 39.70µ ± 1% +2.66% (p=0.000 n=10) +FreqResponse_ShortSweep-8 13.01µ ± 1% 12.95µ ± 1% ~ (p=0.289 n=10) +FrequencySweepKernels/N4_W2/StateSpace-8 653.0n ± 1% 651.1n ± 2% ~ (p=0.353 n=10) +FrequencySweepKernels/N4_W2/TransferFunction-8 9.215µ ± 3% 9.528µ ± 4% +3.40% (p=0.043 n=10) +FrequencySweepKernels/N4_W8/StateSpace-8 2.386µ ± 2% 2.377µ ± 1% ~ (p=0.066 n=10) +FrequencySweepKernels/N4_W8/TransferFunction-8 9.451µ ± 4% 9.875µ ± 6% ~ (p=0.218 n=10) +FrequencySweepKernels/N4_W32/StateSpace-8 9.446µ ± 1% 9.344µ ± 1% -1.09% (p=0.028 n=10) +FrequencySweepKernels/N4_W32/TransferFunction-8 10.46µ ± 6% 10.56µ ± 4% ~ (p=0.912 n=10) +FrequencySweepKernels/N4_W100/StateSpace-8 28.68µ ± 2% 28.55µ ± 1% -0.47% (p=0.015 n=10) +FrequencySweepKernels/N4_W100/TransferFunction-8 12.76µ ± 5% 13.23µ ± 3% ~ (p=0.052 n=10) +FrequencySweepKernels/N10_W2/StateSpace-8 3.408µ ± 1% 3.387µ ± 1% ~ (p=0.224 n=10) +FrequencySweepKernels/N10_W2/TransferFunction-8 28.36µ ± 4% 29.03µ ± 3% ~ (p=0.190 n=10) +FrequencySweepKernels/N10_W8/StateSpace-8 12.85µ ± 2% 12.83µ ± 1% ~ (p=0.529 n=10) +FrequencySweepKernels/N10_W8/TransferFunction-8 29.57µ ± 5% 29.78µ ± 2% ~ (p=0.631 n=10) +FrequencySweepKernels/N10_W32/StateSpace-8 51.11µ ± 1% 50.69µ ± 1% ~ (p=0.075 n=10) +FrequencySweepKernels/N10_W32/TransferFunction-8 32.44µ ± 2% 32.58µ ± 1% ~ (p=0.796 n=10) +FrequencySweepKernels/N10_W100/StateSpace-8 156.1µ ± 2% 155.3µ ± 1% -0.51% (p=0.035 n=10) +FrequencySweepKernels/N10_W100/TransferFunction-8 39.57µ ± 2% 39.67µ ± 1% ~ (p=0.353 n=10) +Bode-8 103.6µ ± 7% 104.1µ ± 1% ~ (p=0.481 n=10) +Zeros_SISO-8 14.48µ ± 6% 14.49µ ± 3% ~ (p=0.971 n=10) +Zeros_MIMO-8 15.77µ ± 3% 15.55µ ± 3% ~ (p=0.393 n=10) +Zeros_NonSquare-8 11.28µ ± 1% 11.38µ ± 1% ~ (p=0.160 n=10) +ControllabilityStaircase-8 36.10µ ± 1% 38.06µ ± 2% +5.44% (p=0.000 n=10) +SimulateNoDelay-8 177.3µ ± 2% 172.0µ ± 1% -2.99% (p=0.000 n=10) +ThiranDelay-8 351.0n ± 2% 343.8n ± 1% -2.04% (p=0.004 n=10) +PadeDelay-8 413.6n ± 5% 409.9n ± 2% -0.89% (p=0.050 n=10) +DecomposeIODelay-8 204.9n ± 1% 206.8n ± 1% +0.88% (p=0.024 n=10) +PullDelaysToLFT-8 1.405µ ± 5% 1.387µ ± 5% ~ (p=0.305 n=10) +GetDelayModel-8 1.478µ ± 11% 1.461µ ± 3% ~ (p=0.197 n=10) +SetDelayModel-8 528.5n ± 8% 517.6n ± 2% -2.07% (p=0.016 n=10) +AbsorbInternalDelay-8 1.442µ ± 11% 1.403µ ± 4% ~ (p=0.086 n=10) +DiscretizeWithOpts_Thiran-8 3.609µ ± 7% 3.584µ ± 2% ~ (p=0.565 n=10) +DiscretizeWithOpts_IODelayThiran-8 3.714µ ± 9% 3.727µ ± 1% ~ (p=0.971 n=10) +FeedbackApproximatedDelays-8 5.450µ ± 11% 5.450µ ± 1% ~ (p=0.782 n=10) +SimulateInternalDelay-8 22.72µ ± 13% 22.85µ ± 2% ~ (p=0.210 n=10) +FreqResponseWithDelay-8 20.79µ ± 5% 20.31µ ± 2% -2.30% (p=0.019 n=10) +PadeSystem-8 9.072µ ± 11% 8.935µ ± 5% ~ (p=0.315 n=10) +ZeroDelayApprox-8 1.631µ ± 6% 1.640µ ± 2% ~ (p=0.516 n=10) +IsStrictlyUpperTriangular-8 110.4n ± 2% 110.0n ± 1% ~ (p=0.268 n=10) +FreqResponseLFT-8 102.1µ ± 5% 101.1µ ± 1% ~ (p=0.190 n=10) +Simulate_DCMotor-8 46.87µ ± 8% 39.78µ ± 1% -15.13% (p=0.000 n=10) +FreqResponse_B747Lateral-8 18.47µ ± 7% 17.95µ ± 4% -2.84% (p=0.011 n=10) +Simulate_MassSpringDamper-8 48.20µ ± 3% 42.89µ ± 1% -11.02% (p=0.000 n=10) +DiscretizeAndSimulate_B747Longitudinal-8 16.04µ ± 7% 13.51µ ± 2% -15.81% (p=0.000 n=10) +Simulate_Large-8 2.064m ± 2% 2.065m ± 1% ~ (p=0.481 n=10) +FeedbackAndSimulate-8 19.91µ ± 5% 16.81µ ± 2% -15.59% (p=0.000 n=10) +Bode_LargeMIMO-8 571.8µ ± 3% 572.2µ ± 2% ~ (p=0.529 n=10) +Lyap_N10-8 14.44µ ± 3% 14.45µ ± 4% ~ (p=0.579 n=10) +Lyap_N50-8 636.0µ ± 2% 628.9µ ± 2% -1.11% (p=0.043 n=10) +Lyap_N100-8 4.050m ± 1% 4.040m ± 1% ~ (p=0.218 n=10) +DLyap_N10-8 14.30µ ± 2% 14.28µ ± 3% ~ (p=0.579 n=10) +DLyap_N50-8 837.6µ ± 1% 836.5µ ± 3% ~ (p=0.631 n=10) +DLyap_N100-8 6.991m ± 1% 6.984m ± 1% ~ (p=0.796 n=10) +Care_N10_M2-8 69.78µ ± 9% 69.83µ ± 9% ~ (p=0.912 n=10) +Care_N50_M5-8 4.814m ± 2% 4.871m ± 2% ~ (p=0.190 n=10) +Care_N100_M5-8 37.94m ± 1% 37.67m ± 1% ~ (p=0.075 n=10) +Dare_N10_M2-8 69.71µ ± 8% 70.69µ ± 8% ~ (p=0.393 n=10) +Dare_N50_M5-8 5.400m ± 2% 5.510m ± 2% +2.03% (p=0.007 n=10) +Dare_N100_M5-8 37.67m ± 1% 37.30m ± 0% -0.98% (p=0.001 n=10) +Gram-8 26.88µ ± 2% 26.92µ ± 3% ~ (p=0.853 n=10) +Ctrb-8 1.658µ ± 1% 1.662µ ± 1% ~ (p=0.926 n=10) +H2Norm-8 25.50µ ± 2% 25.77µ ± 2% +1.07% (p=0.019 n=10) +HSV-8 49.73µ ± 2% 49.62µ ± 2% ~ (p=0.928 n=10) +HinfNorm-8 2.300m ± 6% 2.304m ± 10% ~ (p=0.853 n=10) +H2Syn_Simple-8 14.60µ ± 4% 14.78µ ± 4% ~ (p=0.247 n=10) +HinfSyn_Simple-8 196.2µ ± 1% 194.9µ ± 5% ~ (p=0.739 n=10) +Balreal-8 57.38µ ± 3% 57.60µ ± 1% ~ (p=0.853 n=10) +Balred-8 58.12µ ± 3% 57.73µ ± 2% ~ (p=0.684 n=10) +Place_N10_M2-8 14.84µ ± 5% 14.63µ ± 2% ~ (p=0.079 n=10) +Place_N50_M5-8 289.3µ ± 1% 290.1µ ± 1% ~ (p=0.579 n=10) +Place_N100_M5-8 1.918m ± 2% 1.914m ± 1% ~ (p=0.684 n=10) +Acker_N5-8 2.715µ ± 2% 2.689µ ± 2% ~ (p=0.066 n=10) +Acker_N10-8 12.56µ ± 2% 12.63µ ± 2% ~ (p=0.592 n=10) +Lqr_N10_M2-8 63.01µ ± 11% 65.18µ ± 6% ~ (p=0.971 n=10) +Lqr_N50_M5-8 4.857m ± 2% 4.860m ± 1% ~ (p=0.739 n=10) +Lqr_N100_M5-8 37.81m ± 3% 37.63m ± 1% -0.47% (p=0.043 n=10) +Kalman_N10_M2_P3-8 84.41µ ± 6% 83.87µ ± 5% ~ (p=0.684 n=10) +Kalman_N50_M5_P5-8 5.572m ± 3% 5.563m ± 1% ~ (p=0.912 n=10) +Kalman_N100_M5_P5-8 38.09m ± 2% 38.06m ± 1% ~ (p=0.529 n=10) +Estim_N10_M2_P3-8 1.792µ ± 6% 1.706µ ± 2% ~ (p=0.063 n=10) +Estim_N50_M5_P5-8 16.91µ ± 8% 16.37µ ± 8% ~ (p=0.089 n=10) +Estim_N100_M5_P5-8 58.70µ ± 7% 50.48µ ± 9% -14.01% (p=0.000 n=10) +Reg_N10_M2_P3-8 1.984µ ± 4% 1.921µ ± 2% -3.18% (p=0.009 n=10) +Reg_N50_M5_P5-8 19.50µ ± 8% 19.28µ ± 7% ~ (p=0.436 n=10) +Reg_N100_M5_P5-8 85.22µ ± 3% 66.83µ ± 3% -21.59% (p=0.000 n=10) +PolyRoots_N10-8 18.67µ ± 1% 18.68µ ± 1% ~ (p=0.529 n=10) +ZPKEval_SISO-8 50.30n ± 6% 49.90n ± 2% ~ (p=0.853 n=10) +ZPKFreqResponse_SISO_100-8 1.765µ ± 2% 1.737µ ± 2% -1.59% (p=0.012 n=10) +ZPKToTF_SISO_N10-8 1.761µ ± 1% 1.761µ ± 1% ~ (p=0.566 n=10) +TFToZPK_SISO_N10-8 36.45µ ± 1% 36.64µ ± 2% ~ (p=0.190 n=10) +SSToZPK_SISO-8 17.07µ ± 3% 17.28µ ± 1% ~ (p=0.481 n=10) +ZPKToSS_SISO-8 770.5n ± 1% 763.8n ± 1% ~ (p=0.218 n=10) +PolyFromComplexRoots_N20-8 327.2n ± 5% 320.9n ± 2% -1.91% (p=0.035 n=10) +Sigma_SISO-8 12.59µ ± 6% 12.53µ ± 2% ~ (p=1.000 n=10) +Sigma_MIMO-8 94.95µ ± 1% 94.07µ ± 1% ~ (p=0.075 n=10) +Nichols-8 19.29µ ± 3% 19.32µ ± 3% ~ (p=0.481 n=10) +Nyquist-8 47.06µ ± 2% 47.14µ ± 1% ~ (p=1.000 n=10) +FreqRespEst_SISO-8 146.8µ ± 1% 147.4µ ± 1% ~ (p=0.436 n=10) +FreqRespEst_MIMO-8 375.4µ ± 1% 376.8µ ± 1% ~ (p=0.529 n=10) +BlkDiag-8 1.629µ ± 8% 1.589µ ± 8% ~ (p=0.184 n=10) +Connect-8 5.499µ ± 3% 5.476µ ± 4% ~ (p=0.643 n=10) +LFT-8 5.320µ ± 1% 5.299µ ± 2% ~ (p=0.481 n=10) +LFT_Large-8 10.52µ ± 2% 10.43µ ± 2% ~ (p=0.325 n=10) +D2C_ZOH_N2-8 3.119µ ± 2% 3.117µ ± 3% ~ (p=0.684 n=10) +D2C_ZOH_N5-8 6.659µ ± 2% 6.742µ ± 1% ~ (p=0.101 n=10) +D2C_ZOH_N20-8 62.01µ ± 2% 64.39µ ± 2% +3.84% (p=0.000 n=10) +D2C_ZOH_N50-8 418.4µ ± 1% 455.5µ ± 2% +8.87% (p=0.000 n=10) +D2C_Tustin_N20-8 14.17µ ± 1% 14.22µ ± 0% ~ (p=0.165 n=10) +MatLog_N20-8 49.90µ ± 1% 52.48µ ± 2% +5.18% (p=0.000 n=10) +MatLog_N50-8 333.2µ ± 2% 374.1µ ± 2% +12.28% (p=0.000 n=10) +DCGain_StableMIMO_N10_M4_P6-8 3.265µ ± 1% 3.319µ ± 1% +1.67% (p=0.004 n=10) +DCGain_IntegratorMIMO_N10_M4_P6-8 4.728µ ± 8% 4.825µ ± 3% +2.06% (p=0.023 n=10) +DCGain_IntegratorMIMO_N40_M8_P8-8 51.21µ ± 3% 51.02µ ± 2% ~ (p=0.853 n=10) +SystemFRD_SISO_200-8 11.53µ ± 6% 11.60µ ± 6% ~ (p=0.838 n=10) +SystemFRD_SISO_2000-8 54.55µ ± 4% 53.22µ ± 3% ~ (p=0.280 n=10) +SystemFRD_SISO_10000-8 225.7µ ± 6% 247.6µ ± 3% +9.66% (p=0.001 n=10) +SystemFRD_MIMO_200-8 90.90µ ± 2% 90.43µ ± 1% ~ (p=0.190 n=10) +SystemFRD_MIMO_2000-8 517.7µ ± 8% 511.7µ ± 8% ~ (p=0.353 n=10) +SystemFRD_MIMO_10000-8 2.406m ± 3% 2.374m ± 3% ~ (p=0.218 n=10) +SystemFRD_Large_2000-8 8.366m ± 1% 8.385m ± 1% ~ (p=0.393 n=10) +FRDSigma_SISO_200-8 998.7n ± 2% 979.2n ± 3% -1.96% (p=0.043 n=10) +FRDSigma_SISO_2000-8 9.170µ ± 5% 9.100µ ± 9% ~ (p=0.469 n=10) +FRDSigma_MIMO_200-8 226.8µ ± 1% 226.6µ ± 1% ~ (p=0.796 n=10) +FRDSigma_MIMO_2000-8 2.252m ± 1% 2.250m ± 0% ~ (p=0.684 n=10) +FRDSigma_MIMO_10000-8 11.24m ± 0% 11.21m ± 1% ~ (p=0.739 n=10) +FRDSigma_Large_2000-8 4.228m ± 1% 4.237m ± 1% ~ (p=0.190 n=10) +FRDMargin_200-8 5.790µ ± 1% 5.726µ ± 2% ~ (p=0.247 n=10) +FRDMargin_2000-8 49.76µ ± 1% 49.67µ ± 0% ~ (p=0.289 n=10) +FRDMargin_10000-8 247.0µ ± 1% 245.9µ ± 2% ~ (p=0.796 n=10) +FRDMargin_NegGM_2000-8 50.75µ ± 1% 50.86µ ± 4% ~ (p=0.280 n=10) +FRDSigma_MIMO5x5_2000-8 6.172m ± 2% 6.167m ± 0% ~ (p=0.912 n=10) +FRDSeries_SISO_200-8 3.585µ ± 5% 3.690µ ± 8% ~ (p=0.684 n=10) +FRDSeries_SISO_2000-8 38.99µ ± 1% 38.40µ ± 2% -1.53% (p=0.009 n=10) +FRDSeries_MIMO_200-8 16.18µ ± 2% 15.87µ ± 3% ~ (p=0.061 n=10) +FRDSeries_MIMO_2000-8 174.0µ ± 2% 170.2µ ± 3% ~ (p=0.089 n=10) +FRDSeries_MIMO_10000-8 811.8µ ± 2% 808.2µ ± 2% ~ (p=0.315 n=10) +FRDParallel_SISO_2000-8 38.17µ ± 2% 37.33µ ± 2% -2.20% (p=0.043 n=10) +FRDParallel_MIMO_2000-8 113.7µ ± 3% 112.6µ ± 7% ~ (p=0.853 n=10) +FRDFeedback_SISO_200-8 7.170µ ± 2% 7.017µ ± 4% ~ (p=0.210 n=10) +FRDFeedback_SISO_2000-8 71.26µ ± 7% 71.17µ ± 7% ~ (p=0.631 n=10) +FRDFeedback_MIMO_200-8 53.44µ ± 4% 52.88µ ± 1% -1.05% (p=0.009 n=10) +FRDFeedback_MIMO_2000-8 540.2µ ± 2% 532.8µ ± 3% -1.37% (p=0.035 n=10) +FRDFeedback_MIMO_10000-8 2.601m ± 2% 2.605m ± 2% ~ (p=0.579 n=10) +FRDFeedback_MIMO8x8_2000-8 4.153m ± 2% 4.137m ± 1% ~ (p=0.684 n=10) +FRDAbs_MIMO_2000-8 199.5µ ± 7% 192.0µ ± 5% ~ (p=0.315 n=10) +FRDSelectFrequencies_MIMO_2000-8 68.61µ ± 2% 66.83µ ± 6% ~ (p=0.353 n=10) +FRDPeakGain_MIMO_2000-8 2.244m ± 2% 2.242m ± 2% ~ (p=0.853 n=10) +ModelArrayFreqResponse_MIMO_16x200-8 1.165m ± 3% 1.162m ± 5% ~ (p=0.739 n=10) +ModelArrayFreqResponseManualLoop_MIMO_16x200-8 1.162m ± 3% 1.140m ± 1% -1.87% (p=0.023 n=10) +Step_SISO_N2-8 10.34µ ± 3% 10.35µ ± 1% ~ (p=0.631 n=10) +Step_SISO_N10-8 114.4µ ± 3% 106.4µ ± 2% -6.94% (p=0.000 n=10) +Step_SISO_N50-8 7.085m ± 1% 7.080m ± 1% ~ (p=0.579 n=10) +Step_MIMO_N10-8 211.9µ ± 4% 212.2µ ± 3% ~ (p=0.529 n=10) +StepInfo_SISO_N10-8 3.100µ ± 1% 3.107µ ± 1% ~ (p=0.469 n=10) +StepInfo_MIMO_N10-8 34.50µ ± 1% 34.58µ ± 1% ~ (p=0.617 n=10) +ModelArrayStep_MIMO_16-8 2.978m ± 1% 2.990m ± 2% ~ (p=0.075 n=10) +ModelArrayStepManualLoop_MIMO_16-8 2.956m ± 1% 2.978m ± 2% ~ (p=0.089 n=10) +Impulse_SISO_N2-8 10.24µ ± 1% 10.29µ ± 2% ~ (p=0.739 n=10) +Impulse_SISO_N10-8 113.9µ ± 1% 105.9µ ± 1% -6.97% (p=0.000 n=10) +Impulse_SISO_N50-8 7.079m ± 1% 7.064m ± 2% ~ (p=0.280 n=10) +Impulse_MIMO_N10-8 210.8µ ± 1% 212.9µ ± 1% +0.99% (p=0.015 n=10) +Lsim_SISO_N2-8 28.51µ ± 1% 23.88µ ± 2% -16.24% (p=0.000 n=10) +Lsim_SISO_N10-8 67.07µ ± 1% 62.05µ ± 2% -7.49% (p=0.000 n=10) +Lsim_SISO_N50-8 1.040m ± 1% 1.045m ± 1% +0.52% (p=0.035 n=10) +Lsim_MIMO_N10-8 92.82µ ± 3% 85.97µ ± 1% -7.38% (p=0.000 n=10) +Lsim_SISO_1e4-8 619.8µ ± 1% 560.1µ ± 1% -9.63% (p=0.000 n=10) +Lsim_MIMO_1e4-8 1.654m ± 1% 1.548m ± 2% -6.44% (p=0.000 n=10) +Lsim_Discrete_SISO-8 64.55µ ± 2% 56.56µ ± 2% -12.37% (p=0.000 n=10) +Loopsens_SISO_N2-8 8.663µ ± 2% 8.660µ ± 2% ~ (p=0.796 n=10) +Loopsens_SISO_N10-8 14.20µ ± 1% 14.32µ ± 2% ~ (p=0.197 n=10) +Loopsens_MIMO_N10-8 19.85µ ± 3% 19.50µ ± 2% ~ (p=0.247 n=10) +Canon_Modal_N2-8 2.413µ ± 1% 2.422µ ± 3% ~ (p=0.494 n=10) +Canon_Modal_N10-8 20.98µ ± 2% 20.85µ ± 4% ~ (p=0.481 n=10) +Canon_Modal_N50-8 640.6µ ± 1% 665.9µ ± 2% +3.95% (p=0.000 n=10) +Canon_Modal_N100-8 7.800m ± 1% 7.783m ± 3% ~ (p=0.853 n=10) +Canon_Comp_N2-8 2.826µ ± 2% 2.866µ ± 5% +1.42% (p=0.020 n=10) +Canon_Comp_N10-8 21.17µ ± 1% 21.15µ ± 4% ~ (p=0.971 n=10) +DescriptorToExplicit_N10-8 3.335µ ± 4% 3.304µ ± 4% ~ (p=0.279 n=10) +DescriptorFreqResponse_MIMO_N10x200-8 351.5µ ± 1% 351.6µ ± 1% ~ (p=0.631 n=10) +DescriptorFreqResponse_MIMO_N50x200-8 15.80m ± 1% 15.73m ± 1% ~ (p=0.393 n=10) +FixedInputReduction_N10-8 559.2n ± 2% 560.6n ± 6% ~ (p=0.912 n=10) +TunableGainCurrentSystem_4x4-8 233.5n ± 7% 242.8n ± 10% ~ (p=0.853 n=10) +TunableGainSampleCurrentSystem_4x4-8 862.2n ± 3% 854.1n ± 8% ~ (p=0.481 n=10) +GeneralizedCurrentSystem_SISO-8 184.6n ± 5% 178.8n ± 11% ~ (p=0.079 n=10) +GeneralizedClosedLoop_SISO-8 2.468µ ± 2% 2.486µ ± 7% ~ (p=0.382 n=10) +TuningGoalWeightedGain_SISO-8 15.65µ ± 2% 15.21µ ± 8% ~ (p=0.119 n=10) +TuningGoalWeightedGain_MIMO-8 125.4µ ± 3% 126.9µ ± 3% ~ (p=0.971 n=10) +TuningGoalDynamicWeightedGain_MIMO-8 120.0µ ± 1% 119.5µ ± 4% ~ (p=0.631 n=10) +Systune_SISO-8 76.58µ ± 5% 75.39µ ± 7% ~ (p=0.393 n=10) +Systune_MIMO-8 193.7µ ± 3% 188.4µ ± 3% -2.77% (p=0.004 n=10) +PhysicalAssembly_8Components-8 19.66µ ± 4% 18.96µ ± 7% -3.57% (p=0.035 n=10) +ModalTruncate_N50_Order10-8 468.5µ ± 1% 468.8µ ± 2% ~ (p=0.579 n=10) +Passivity_SISO-8 8.449µ ± 3% 8.229µ ± 5% ~ (p=0.143 n=10) +FRDPassivity_MIMO-8 2.448µ ± 1% 2.425µ ± 2% ~ (p=0.183 n=10) +Stabsep_N2-8 3.135µ ± 2% 3.121µ ± 2% ~ (p=0.631 n=10) +Stabsep_N10-8 33.37µ ± 2% 34.37µ ± 2% +3.00% (p=0.019 n=10) +Stabsep_N50-8 1.403m ± 1% 1.473m ± 2% +4.97% (p=0.000 n=10) +Stabsep_N100-8 8.983m ± 1% 9.558m ± 2% +6.40% (p=0.000 n=10) +Modsep_N10-8 34.93µ ± 2% 35.97µ ± 2% +2.99% (p=0.003 n=10) +Modsep_N50-8 1.436m ± 1% 1.513m ± 3% +5.35% (p=0.000 n=10) +Ssbal_N2-8 322.8n ± 2% 319.1n ± 2% ~ (p=0.123 n=10) +Ssbal_N10-8 891.2n ± 1% 862.1n ± 5% -3.27% (p=0.018 n=10) +Ssbal_N50-8 10.82µ ± 3% 10.45µ ± 5% -3.41% (p=0.015 n=10) +Prescale_N2-8 771.4n ± 1% 757.0n ± 2% -1.85% (p=0.011 n=10) +Prescale_N10-8 3.188µ ± 1% 3.201µ ± 3% ~ (p=0.436 n=10) +Prescale_N50-8 64.66µ ± 0% 64.86µ ± 1% ~ (p=1.000 n=10) +Sminreal_N2-8 259.0n ± 2% 255.9n ± 4% ~ (p=0.280 n=10) +Sminreal_N10-8 589.5n ± 4% 563.0n ± 7% -4.50% (p=0.019 n=10) +Sminreal_N50-8 4.951µ ± 7% 4.751µ ± 2% ~ (p=0.315 n=10) +Inv_SISO_N2-8 941.6n ± 1% 948.0n ± 2% ~ (p=0.165 n=10) +Inv_SISO_N10-8 1.579µ ± 2% 1.592µ ± 2% ~ (p=0.342 n=10) +Inv_MIMO_N10-8 2.409µ ± 2% 2.402µ ± 12% ~ (p=1.000 n=10) +Covar_SISO_N2-8 1.798µ ± 2% 1.831µ ± 3% +1.84% (p=0.022 n=10) +Covar_SISO_N10-8 8.946µ ± 1% 9.084µ ± 2% +1.54% (p=0.015 n=10) +Covar_SISO_N50-8 266.1µ ± 1% 264.9µ ± 2% ~ (p=0.853 n=10) +Covar_SISO_N100-8 1.732m ± 1% 1.758m ± 2% ~ (p=0.063 n=10) +Covar_MIMO_N10-8 8.966µ ± 1% 9.068µ ± 2% ~ (p=0.086 n=10) +Pidtune_PI-8 43.07µ ± 1% 42.87µ ± 2% ~ (p=0.436 n=10) +Pidtune_PID-8 42.99µ ± 1% 42.84µ ± 1% ~ (p=0.631 n=10) +Pidtune_PIDF-8 43.08µ ± 1% 42.77µ ± 1% ~ (p=0.123 n=10) +Margin_SISO-8 78.72µ ± 1% 78.26µ ± 1% ~ (p=0.271 n=10) +Bandwidth_SISO-8 54.05µ ± 1% 53.90µ ± 2% ~ (p=0.315 n=10) +DiskMargin_SISO-8 18.18µ ± 3% 18.65µ ± 2% +2.55% (p=0.005 n=10) +geomean 37.20µ 36.92µ -0.75% + + │ baseline.txt │ candidate.txt │ + │ B/op │ B/op vs base │ +SimulateWithDelay_SISO-8 1.492Ki ± 0% 1.492Ki ± 0% ~ (p=1.000 n=10) +SimulateWithDelay_MIMO-8 11.48Ki ± 0% 11.48Ki ± 0% ~ (p=0.474 n=10) +BilinearDiscretize-8 14.59Ki ± 0% 14.59Ki ± 0% ~ (p=0.897 n=10) +TransferFunction_MIMO-8 72.66Ki ± 0% 72.66Ki ± 0% ~ (p=0.128 n=10) +Reduce-8 52.45Ki ± 0% 52.45Ki ± 0% ~ (p=0.541 n=10) +AbsorbDelay-8 4.227Ki ± 0% 4.227Ki ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeZOH-8 21.66Ki ± 0% 21.67Ki ± 0% ~ (p=0.054 n=10) +DenseNorm-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ +Series-8 5.000Ki ± 0% 5.000Ki ± 0% ~ (p=1.000 n=10) ¹ +Parallel-8 4.172Ki ± 0% 4.172Ki ± 0% ~ (p=1.000 n=10) ¹ +Feedback-8 8.504Ki ± 0% 8.503Ki ± 0% ~ (p=1.000 n=10) +FeedbackLFT-8 46.95Ki ± 0% 46.94Ki ± 0% ~ (p=0.302 n=10) +Append-8 5.109Ki ± 0% 5.109Ki ± 0% ~ (p=1.000 n=10) ¹ +FreqResponse-8 65.34Ki ± 0% 65.34Ki ± 0% ~ (p=0.723 n=10) +FreqResponse_ShortSweep-8 3.031Ki ± 0% 3.031Ki ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W2/StateSpace-8 576.0 ± 0% 576.0 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W2/TransferFunction-8 44.35Ki ± 0% 44.35Ki ± 0% ~ (p=0.228 n=10) +FrequencySweepKernels/N4_W8/StateSpace-8 960.0 ± 0% 960.0 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W8/TransferFunction-8 44.72Ki ± 0% 44.73Ki ± 0% ~ (p=0.156 n=10) +FrequencySweepKernels/N4_W32/StateSpace-8 2.438Ki ± 0% 2.438Ki ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W32/TransferFunction-8 46.23Ki ± 0% 46.23Ki ± 0% ~ (p=0.811 n=10) +FrequencySweepKernels/N4_W100/StateSpace-8 6.812Ki ± 0% 6.812Ki ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W100/TransferFunction-8 50.61Ki ± 0% 50.61Ki ± 0% ~ (p=0.642 n=10) +FrequencySweepKernels/N10_W2/StateSpace-8 2.344Ki ± 0% 2.344Ki ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W2/TransferFunction-8 55.85Ki ± 0% 55.85Ki ± 0% ~ (p=0.926 n=10) +FrequencySweepKernels/N10_W8/StateSpace-8 2.906Ki ± 0% 2.906Ki ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W8/TransferFunction-8 56.42Ki ± 0% 56.42Ki ± 0% ~ (p=0.591 n=10) +FrequencySweepKernels/N10_W32/StateSpace-8 5.156Ki ± 0% 5.156Ki ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W32/TransferFunction-8 58.68Ki ± 0% 58.68Ki ± 0% -0.01% (p=0.041 n=10) +FrequencySweepKernels/N10_W100/StateSpace-8 11.66Ki ± 0% 11.66Ki ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W100/TransferFunction-8 65.21Ki ± 0% 65.21Ki ± 0% ~ (p=0.382 n=10) +Bode-8 98.86Ki ± 0% 98.85Ki ± 0% ~ (p=0.210 n=10) +Zeros_SISO-8 45.75Ki ± 0% 45.75Ki ± 0% ~ (p=0.926 n=10) +Zeros_MIMO-8 45.74Ki ± 0% 45.74Ki ± 0% ~ (p=0.809 n=10) +Zeros_NonSquare-8 6.734Ki ± 0% 6.734Ki ± 0% ~ (p=1.000 n=10) ¹ +ControllabilityStaircase-8 22.15Ki ± 0% 22.15Ki ± 0% ~ (p=0.838 n=10) +SimulateNoDelay-8 34.37Ki ± 0% 32.60Ki ± 0% -5.14% (p=0.000 n=10) +ThiranDelay-8 808.0 ± 0% 808.0 ± 0% ~ (p=1.000 n=10) ¹ +PadeDelay-8 1.023Ki ± 0% 1.023Ki ± 0% ~ (p=1.000 n=10) ¹ +DecomposeIODelay-8 368.0 ± 0% 368.0 ± 0% ~ (p=1.000 n=10) ¹ +PullDelaysToLFT-8 3.867Ki ± 0% 3.867Ki ± 0% ~ (p=1.000 n=10) ¹ +GetDelayModel-8 4.312Ki ± 0% 4.312Ki ± 0% ~ (p=1.000 n=10) ¹ +SetDelayModel-8 1.484Ki ± 0% 1.484Ki ± 0% ~ (p=1.000 n=10) ¹ +AbsorbInternalDelay-8 4.859Ki ± 0% 4.859Ki ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeWithOpts_Thiran-8 3.591Ki ± 0% 3.591Ki ± 0% ~ (p=0.474 n=10) +DiscretizeWithOpts_IODelayThiran-8 3.771Ki ± 0% 3.771Ki ± 0% ~ (p=0.650 n=10) +FeedbackApproximatedDelays-8 11.39Ki ± 0% 11.39Ki ± 0% -0.01% (p=0.007 n=10) +SimulateInternalDelay-8 2.000Ki ± 0% 2.000Ki ± 0% ~ (p=1.000 n=10) ¹ +FreqResponseWithDelay-8 52.06Ki ± 0% 52.06Ki ± 0% -0.01% (p=0.003 n=10) +PadeSystem-8 21.12Ki ± 0% 21.12Ki ± 0% ~ (p=0.548 n=10) +ZeroDelayApprox-8 1.556Ki ± 0% 1.556Ki ± 0% ~ (p=1.000 n=10) ¹ +IsStrictlyUpperTriangular-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponseLFT-8 9.281Ki ± 0% 9.281Ki ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 19.67Ki ± 0% 16.28Ki ± 0% -17.23% (p=0.000 n=10) +FreqResponse_B747Lateral-8 57.42Ki ± 0% 57.40Ki ± 0% -0.02% (p=0.000 n=10) +Simulate_MassSpringDamper-8 10.126Ki ± 0% 8.375Ki ± 0% -17.30% (p=0.000 n=10) +DiscretizeAndSimulate_B747Longitudinal-8 7.517Ki ± 0% 6.578Ki ± 0% -12.49% (p=0.000 n=10) +Simulate_Large-8 84.52Ki ± 0% 81.14Ki ± 0% -3.99% (p=0.000 n=10) +FeedbackAndSimulate-8 7.547Ki ± 0% 6.609Ki ± 0% -12.42% (p=0.000 n=10) +Bode_LargeMIMO-8 233.9Ki ± 0% 233.8Ki ± 0% -0.05% (p=0.003 n=10) +Lyap_N10-8 7.031Ki ± 0% 7.031Ki ± 0% ~ (p=1.000 n=10) ¹ +Lyap_N50-8 122.1Ki ± 0% 122.1Ki ± 0% ~ (p=1.000 n=10) ¹ +Lyap_N100-8 373.1Ki ± 0% 373.6Ki ± 0% +0.14% (p=0.000 n=10) +DLyap_N10-8 7.367Ki ± 0% 7.367Ki ± 0% ~ (p=1.000 n=10) ¹ +DLyap_N50-8 124.5Ki ± 0% 124.5Ki ± 0% ~ (p=1.000 n=10) +DLyap_N100-8 439.2Ki ± 0% 439.5Ki ± 0% +0.07% (p=0.000 n=10) +Care_N10_M2-8 1.788Ki ± 0% 1.788Ki ± 0% ~ (p=0.845 n=10) +Care_N50_M5-8 45.73Ki ± 0% 45.73Ki ± 0% ~ (p=1.000 n=10) ¹ +Care_N100_M5-8 173.0Ki ± 1% 171.5Ki ± 2% ~ (p=0.137 n=10) +Dare_N10_M2-8 1.702Ki ± 0% 1.702Ki ± 0% ~ (p=0.750 n=10) +Dare_N50_M5-8 46.71Ki ± 0% 46.71Ki ± 0% ~ (p=1.000 n=10) ¹ +Dare_N100_M5-8 300.9Ki ± 1% 296.3Ki ± 1% -1.53% (p=0.000 n=10) +Gram-8 11.76Ki ± 0% 11.76Ki ± 0% ~ (p=0.336 n=10) +Ctrb-8 1.812Ki ± 0% 1.812Ki ± 0% ~ (p=1.000 n=10) ¹ +H2Norm-8 11.79Ki ± 0% 11.79Ki ± 0% ~ (p=0.921 n=10) +HSV-8 28.67Ki ± 0% 28.66Ki ± 0% ~ (p=0.538 n=10) +HinfNorm-8 145.5Ki ± 0% 145.5Ki ± 0% ~ (p=0.986 n=10) +H2Syn_Simple-8 13.59Ki ± 0% 13.59Ki ± 0% ~ (p=0.881 n=10) +HinfSyn_Simple-8 160.9Ki ± 0% 160.9Ki ± 0% ~ (p=0.089 n=10) +Balreal-8 33.98Ki ± 0% 33.98Ki ± 0% ~ (p=0.782 n=10) +Balred-8 34.89Ki ± 0% 34.88Ki ± 0% ~ (p=0.696 n=10) +Place_N10_M2-8 6.305Ki ± 0% 6.305Ki ± 0% ~ (p=1.000 n=10) ¹ +Place_N50_M5-8 90.75Ki ± 0% 90.75Ki ± 0% ~ (p=0.257 n=10) +Place_N100_M5-8 226.4Ki ± 0% 226.4Ki ± 0% ~ (p=0.492 n=10) +Acker_N5-8 1.540Ki ± 0% 1.540Ki ± 0% ~ (p=1.000 n=10) ¹ +Acker_N10-8 4.959Ki ± 0% 4.959Ki ± 0% ~ (p=1.000 n=10) +Lqr_N10_M2-8 1.786Ki ± 0% 1.786Ki ± 0% ~ (p=0.458 n=10) +Lqr_N50_M5-8 45.73Ki ± 0% 45.73Ki ± 0% ~ (p=1.000 n=10) ¹ +Lqr_N100_M5-8 172.3Ki ± 0% 167.8Ki ± 1% -2.63% (p=0.000 n=10) +Kalman_N10_M2_P3-8 7.628Ki ± 0% 7.628Ki ± 0% ~ (p=0.628 n=10) +Kalman_N50_M5_P5-8 170.5Ki ± 0% 170.5Ki ± 0% ~ (p=1.000 n=10) +Kalman_N100_M5_P5-8 478.7Ki ± 0% 472.8Ki ± 1% -1.22% (p=0.000 n=10) +Estim_N10_M2_P3-8 7.078Ki ± 0% 7.078Ki ± 0% ~ (p=1.000 n=10) ¹ +Estim_N50_M5_P5-8 110.3Ki ± 0% 110.3Ki ± 0% ~ (p=0.303 n=10) +Estim_N100_M5_P5-8 380.3Ki ± 0% 379.3Ki ± 0% -0.25% (p=0.000 n=10) +Reg_N10_M2_P3-8 6.438Ki ± 0% 6.438Ki ± 0% ~ (p=1.000 n=10) ¹ +Reg_N50_M5_P5-8 111.4Ki ± 0% 111.4Ki ± 0% ~ (p=1.000 n=10) +Reg_N100_M5_P5-8 424.2Ki ± 0% 421.4Ki ± 0% -0.66% (p=0.000 n=10) +PolyRoots_N10-8 3.050Ki ± 0% 3.050Ki ± 0% ~ (p=0.548 n=10) +ZPKEval_SISO-8 40.00 ± 0% 40.00 ± 0% ~ (p=1.000 n=10) ¹ +ZPKFreqResponse_SISO_100-8 1.875Ki ± 0% 1.875Ki ± 0% ~ (p=1.000 n=10) ¹ +ZPKToTF_SISO_N10-8 1.852Ki ± 0% 1.852Ki ± 0% ~ (p=1.000 n=10) ¹ +TFToZPK_SISO_N10-8 6.100Ki ± 0% 6.100Ki ± 0% ~ (p=0.812 n=10) +SSToZPK_SISO-8 47.00Ki ± 0% 47.00Ki ± 0% -0.01% (p=0.014 n=10) +ZPKToSS_SISO-8 1.445Ki ± 0% 1.445Ki ± 0% ~ (p=1.000 n=10) ¹ +PolyFromComplexRoots_N20-8 528.0 ± 0% 528.0 ± 0% ~ (p=1.000 n=10) ¹ +Sigma_SISO-8 48.54Ki ± 0% 48.53Ki ± 0% ~ (p=0.082 n=10) +Sigma_MIMO-8 62.29Ki ± 0% 62.28Ki ± 0% -0.01% (p=0.037 n=10) +Nichols-8 50.46Ki ± 0% 50.45Ki ± 0% ~ (p=0.084 n=10) +Nyquist-8 95.44Ki ± 0% 95.43Ki ± 0% ~ (p=0.065 n=10) +FreqRespEst_SISO-8 25.94Ki ± 0% 25.94Ki ± 0% ~ (p=1.000 n=10) ¹ +FreqRespEst_MIMO-8 65.00Ki ± 0% 65.00Ki ± 0% ~ (p=1.000 n=10) +BlkDiag-8 9.812Ki ± 0% 9.812Ki ± 0% ~ (p=1.000 n=10) ¹ +Connect-8 13.87Ki ± 0% 13.87Ki ± 0% -0.01% (p=0.001 n=10) +LFT-8 10.69Ki ± 0% 10.69Ki ± 0% ~ (p=1.000 n=10) +LFT_Large-8 35.32Ki ± 0% 35.32Ki ± 0% -0.01% (p=0.001 n=10) +D2C_ZOH_N2-8 2.171Ki ± 0% 2.171Ki ± 0% ~ (p=0.628 n=10) +D2C_ZOH_N5-8 6.626Ki ± 0% 6.624Ki ± 0% ~ (p=0.118 n=10) +D2C_ZOH_N20-8 77.50Ki ± 0% 77.55Ki ± 0% ~ (p=0.382 n=10) +D2C_ZOH_N50-8 464.4Ki ± 0% 463.5Ki ± 0% ~ (p=0.143 n=10) +D2C_Tustin_N20-8 14.85Ki ± 0% 14.85Ki ± 0% ~ (p=0.236 n=10) +MatLog_N20-8 64.55Ki ± 0% 64.70Ki ± 1% ~ (p=0.631 n=10) +MatLog_N50-8 391.8Ki ± 0% 391.4Ki ± 0% ~ (p=0.393 n=10) +DCGain_StableMIMO_N10_M4_P6-8 1.823Ki ± 0% 1.823Ki ± 0% ~ (p=1.000 n=10) +DCGain_IntegratorMIMO_N10_M4_P6-8 5.267Ki ± 0% 5.266Ki ± 0% ~ (p=0.070 n=10) +DCGain_IntegratorMIMO_N40_M8_P8-8 51.72Ki ± 0% 51.71Ki ± 0% ~ (p=0.323 n=10) +SystemFRD_SISO_200-8 59.60Ki ± 0% 59.60Ki ± 0% ~ (p=0.320 n=10) +SystemFRD_SISO_2000-8 218.2Ki ± 0% 218.2Ki ± 0% ~ (p=0.101 n=10) +SystemFRD_SISO_10000-8 922.6Ki ± 0% 922.7Ki ± 0% +0.01% (p=0.000 n=10) +SystemFRD_MIMO_200-8 164.5Ki ± 0% 164.4Ki ± 0% -0.02% (p=0.007 n=10) +SystemFRD_MIMO_2000-8 1.045Mi ± 0% 1.045Mi ± 0% ~ (p=0.247 n=10) +SystemFRD_MIMO_10000-8 4.970Mi ± 0% 4.970Mi ± 0% ~ (p=0.912 n=10) +SystemFRD_Large_2000-8 2.134Mi ± 0% 2.132Mi ± 0% ~ (p=0.404 n=10) +FRDSigma_SISO_200-8 3.609Ki ± 0% 3.609Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_SISO_2000-8 32.11Ki ± 0% 32.11Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO_200-8 8.805Ki ± 0% 8.805Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO_2000-8 66.30Ki ± 0% 66.30Ki ± 0% ~ (p=1.000 n=10) +FRDSigma_MIMO_10000-8 322.3Ki ± 0% 322.3Ki ± 0% ~ (p=1.000 n=10) +FRDSigma_Large_2000-8 83.04Ki ± 0% 83.04Ki ± 0% ~ (p=1.000 n=10) +FRDMargin_200-8 5.422Ki ± 0% 5.422Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_2000-8 48.17Ki ± 0% 48.17Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_10000-8 240.2Ki ± 0% 240.2Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_NegGM_2000-8 48.17Ki ± 0% 48.17Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO5x5_2000-8 100.2Ki ± 0% 100.2Ki ± 0% ~ (p=1.000 n=10) +FRDSeries_SISO_200-8 14.48Ki ± 0% 14.48Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_SISO_2000-8 144.1Ki ± 0% 144.1Ki ± 0% ~ (p=1.000 n=10) +FRDSeries_MIMO_200-8 54.61Ki ± 0% 54.61Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_MIMO_2000-8 496.1Ki ± 0% 496.1Ki ± 0% ~ (p=0.249 n=10) +FRDSeries_MIMO_10000-8 2.375Mi ± 0% 2.375Mi ± 0% ~ (p=0.139 n=10) +FRDParallel_SISO_2000-8 144.1Ki ± 0% 144.1Ki ± 0% ~ (p=1.000 n=10) +FRDParallel_MIMO_2000-8 496.1Ki ± 0% 496.1Ki ± 0% ~ (p=0.087 n=10) +FRDFeedback_SISO_200-8 14.48Ki ± 0% 14.48Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_SISO_2000-8 144.1Ki ± 0% 144.1Ki ± 0% ~ (p=0.474 n=10) +FRDFeedback_MIMO_200-8 55.31Ki ± 0% 55.31Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO_2000-8 496.8Ki ± 0% 496.8Ki ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO_10000-8 2.376Mi ± 0% 2.376Mi ± 0% ~ (p=1.000 n=10) +FRDFeedback_MIMO8x8_2000-8 2.388Mi ± 0% 2.388Mi ± 0% ~ (p=0.737 n=10) +FRDAbs_MIMO_2000-8 632.1Ki ± 0% 632.1Ki ± 0% ~ (p=0.063 n=10) +FRDSelectFrequencies_MIMO_2000-8 320.1Ki ± 0% 320.1Ki ± 0% ~ (p=0.846 n=10) +FRDPeakGain_MIMO_2000-8 2.219Ki ± 0% 2.219Ki ± 0% ~ (p=1.000 n=10) ¹ +ModelArrayFreqResponse_MIMO_16x200-8 1.338Mi ± 0% 1.337Mi ± 0% -0.02% (p=0.023 n=10) +ModelArrayFreqResponseManualLoop_MIMO_16x200-8 1.335Mi ± 0% 1.335Mi ± 0% ~ (p=0.079 n=10) +Step_SISO_N2-8 8.861Ki ± 0% 8.860Ki ± 0% -0.01% (p=0.019 n=10) +Step_SISO_N10-8 43.71Ki ± 0% 40.91Ki ± 0% -6.39% (p=0.000 n=10) +Step_SISO_N50-8 292.0Ki ± 4% 279.0Ki ± 2% -4.43% (p=0.000 n=10) +Step_MIMO_N10-8 96.29Ki ± 0% 96.29Ki ± 0% ~ (p=0.542 n=10) +StepInfo_SISO_N10-8 112.0 ± 0% 112.0 ± 0% ~ (p=1.000 n=10) ¹ +StepInfo_MIMO_N10-8 816.0 ± 0% 816.0 ± 0% ~ (p=1.000 n=10) ¹ +ModelArrayStep_MIMO_16-8 1.317Mi ± 0% 1.317Mi ± 0% ~ (p=0.481 n=10) +ModelArrayStepManualLoop_MIMO_16-8 1.316Mi ± 0% 1.316Mi ± 0% -0.03% (p=0.035 n=10) +Impulse_SISO_N2-8 8.861Ki ± 0% 8.860Ki ± 0% ~ (p=0.052 n=10) +Impulse_SISO_N10-8 43.72Ki ± 0% 40.92Ki ± 0% -6.41% (p=0.000 n=10) +Impulse_SISO_N50-8 294.0Ki ± 3% 281.5Ki ± 1% -4.26% (p=0.000 n=10) +Impulse_MIMO_N10-8 96.29Ki ± 0% 96.27Ki ± 0% ~ (p=0.105 n=10) +Lsim_SISO_N2-8 15.35Ki ± 0% 13.59Ki ± 0% -11.46% (p=0.000 n=10) +Lsim_SISO_N10-8 19.40Ki ± 0% 17.64Ki ± 0% -9.06% (p=0.000 n=10) +Lsim_SISO_N50-8 102.1Ki ± 0% 100.7Ki ± 0% -1.41% (p=0.000 n=10) +Lsim_MIMO_N10-8 53.16Ki ± 0% 51.39Ki ± 0% -3.32% (p=0.000 n=10) +Lsim_SISO_1e4-8 274.9Ki ± 0% 242.6Ki ± 0% -11.76% (p=0.000 n=10) +Lsim_MIMO_1e4-8 1004.9Ki ± 0% 970.9Ki ± 0% -3.38% (p=0.000 n=10) +Lsim_Discrete_SISO-8 27.81Ki ± 0% 24.44Ki ± 0% -12.13% (p=0.000 n=10) +Loopsens_SISO_N2-8 10.49Ki ± 0% 10.49Ki ± 0% -0.01% (p=0.001 n=10) +Loopsens_SISO_N10-8 32.78Ki ± 0% 32.78Ki ± 0% -0.01% (p=0.000 n=10) +Loopsens_MIMO_N10-8 42.75Ki ± 0% 42.74Ki ± 0% -0.02% (p=0.000 n=10) +Canon_Modal_N2-8 1.511Ki ± 0% 1.511Ki ± 0% ~ (p=1.000 n=10) +Canon_Modal_N10-8 11.17Ki ± 0% 11.17Ki ± 0% ~ (p=0.092 n=10) +Canon_Modal_N50-8 211.4Ki ± 0% 211.5Ki ± 1% ~ (p=0.853 n=10) +Canon_Modal_N100-8 1.099Mi ± 1% 1.094Mi ± 1% ~ (p=0.644 n=10) +Canon_Comp_N2-8 1.925Ki ± 0% 1.925Ki ± 0% ~ (p=1.000 n=10) ¹ +Canon_Comp_N10-8 13.21Ki ± 0% 13.21Ki ± 0% ~ (p=0.237 n=10) +DescriptorToExplicit_N10-8 4.936Ki ± 0% 4.936Ki ± 0% ~ (p=0.474 n=10) +DescriptorFreqResponse_MIMO_N10x200-8 34.48Ki ± 0% 34.48Ki ± 0% ~ (p=1.000 n=10) ¹ +DescriptorFreqResponse_MIMO_N50x200-8 124.5Ki ± 0% 124.5Ki ± 0% ~ (p=1.000 n=10) ¹ +FixedInputReduction_N10-8 1.781Ki ± 0% 1.781Ki ± 0% ~ (p=1.000 n=10) ¹ +TunableGainCurrentSystem_4x4-8 784.0 ± 0% 784.0 ± 0% ~ (p=1.000 n=10) ¹ +TunableGainSampleCurrentSystem_4x4-8 1.781Ki ± 0% 1.781Ki ± 0% ~ (p=1.000 n=10) ¹ +GeneralizedCurrentSystem_SISO-8 544.0 ± 0% 544.0 ± 0% ~ (p=1.000 n=10) ¹ +GeneralizedClosedLoop_SISO-8 3.529Ki ± 0% 3.529Ki ± 0% ~ (p=1.000 n=10) ¹ +TuningGoalWeightedGain_SISO-8 46.33Ki ± 0% 46.32Ki ± 0% -0.02% (p=0.000 n=10) +TuningGoalWeightedGain_MIMO-8 67.62Ki ± 0% 67.61Ki ± 0% ~ (p=0.342 n=10) +TuningGoalDynamicWeightedGain_MIMO-8 178.0Ki ± 0% 177.9Ki ± 0% -0.04% (p=0.009 n=10) +Systune_SISO-8 241.3Ki ± 0% 241.3Ki ± 0% -0.02% (p=0.000 n=10) +Systune_MIMO-8 478.1Ki ± 0% 478.0Ki ± 0% -0.02% (p=0.000 n=10) +PhysicalAssembly_8Components-8 57.23Ki ± 0% 57.23Ki ± 0% -0.00% (p=0.000 n=10) +ModalTruncate_N50_Order10-8 146.8Ki ± 0% 146.8Ki ± 0% ~ (p=1.000 n=10) +Passivity_SISO-8 22.92Ki ± 0% 22.92Ki ± 0% -0.01% (p=0.000 n=10) +FRDPassivity_MIMO-8 1.828Ki ± 0% 1.828Ki ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N2-8 3.017Ki ± 0% 3.017Ki ± 0% 0.00% (p=0.019 n=10) +Stabsep_N10-8 29.35Ki ± 0% 29.35Ki ± 0% ~ (p=0.810 n=10) +Stabsep_N50-8 635.9Ki ± 0% 632.1Ki ± 1% -0.60% (p=0.002 n=10) +Stabsep_N100-8 2.527Mi ± 0% 2.525Mi ± 1% ~ (p=0.971 n=10) +Modsep_N10-8 29.32Ki ± 0% 29.32Ki ± 0% ~ (p=0.644 n=10) +Modsep_N50-8 643.3Ki ± 1% 641.0Ki ± 0% ~ (p=0.143 n=10) +Ssbal_N2-8 704.0 ± 0% 704.0 ± 0% ~ (p=1.000 n=10) ¹ +Ssbal_N10-8 2.703Ki ± 0% 2.703Ki ± 0% ~ (p=1.000 n=10) ¹ +Ssbal_N50-8 42.72Ki ± 0% 42.72Ki ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N2-8 896.0 ± 0% 896.0 ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N10-8 2.234Ki ± 0% 2.234Ki ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N50-8 24.12Ki ± 0% 24.12Ki ± 0% ~ (p=0.112 n=10) +Sminreal_N2-8 592.0 ± 0% 592.0 ± 0% ~ (p=1.000 n=10) ¹ +Sminreal_N10-8 1.859Ki ± 0% 1.859Ki ± 0% ~ (p=1.000 n=10) ¹ +Sminreal_N50-8 23.30Ki ± 0% 23.30Ki ± 0% ~ (p=1.000 n=10) ¹ +Inv_SISO_N2-8 1.157Ki ± 0% 1.157Ki ± 0% ~ (p=1.000 n=10) ¹ +Inv_SISO_N10-8 4.004Ki ± 0% 4.004Ki ± 0% ~ (p=1.000 n=10) ¹ +Inv_MIMO_N10-8 4.975Ki ± 0% 4.974Ki ± 0% -0.02% (p=0.000 n=10) +Covar_SISO_N2-8 1.485Ki ± 0% 1.485Ki ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N10-8 1.791Ki ± 0% 1.791Ki ± 0% ~ (p=1.000 n=10) +Covar_SISO_N50-8 23.81Ki ± 1% 23.81Ki ± 1% ~ (p=0.990 n=10) +Covar_SISO_N100-8 116.6Ki ± 0% 117.0Ki ± 1% ~ (p=0.491 n=10) +Covar_MIMO_N10-8 1.791Ki ± 0% 1.791Ki ± 0% ~ (p=0.350 n=10) +Pidtune_PI-8 52.64Ki ± 0% 52.63Ki ± 0% ~ (p=0.070 n=10) +Pidtune_PID-8 52.64Ki ± 0% 52.64Ki ± 0% -0.01% (p=0.049 n=10) +Pidtune_PIDF-8 52.64Ki ± 0% 52.63Ki ± 0% ~ (p=0.063 n=10) +Margin_SISO-8 75.31Ki ± 0% 75.30Ki ± 0% -0.01% (p=0.017 n=10) +Bandwidth_SISO-8 18.04Ki ± 0% 18.04Ki ± 0% ~ (p=0.123 n=10) +DiskMargin_SISO-8 5.989Ki ± 0% 5.989Ki ± 0% -0.01% (p=0.039 n=10) +geomean ² -0.68% ² +¹ all samples are equal +² summaries must be >0 to compute geomean + + │ baseline.txt │ candidate.txt │ + │ allocs/op │ allocs/op vs base │ +SimulateWithDelay_SISO-8 19.00 ± 0% 19.00 ± 0% ~ (p=1.000 n=10) ¹ +SimulateWithDelay_MIMO-8 20.00 ± 0% 20.00 ± 0% ~ (p=1.000 n=10) ¹ +BilinearDiscretize-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +TransferFunction_MIMO-8 162.0 ± 0% 162.0 ± 0% ~ (p=1.000 n=10) ¹ +Reduce-8 170.0 ± 0% 170.0 ± 0% ~ (p=1.000 n=10) ¹ +AbsorbDelay-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeZOH-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +DenseNorm-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ +Series-8 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹ +Parallel-8 9.000 ± 0% 9.000 ± 0% ~ (p=1.000 n=10) ¹ +Feedback-8 63.00 ± 0% 63.00 ± 0% ~ (p=1.000 n=10) ¹ +FeedbackLFT-8 273.0 ± 0% 273.0 ± 0% ~ (p=1.000 n=10) ¹ +Append-8 9.000 ± 0% 9.000 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponse-8 126.0 ± 0% 126.0 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponse_ShortSweep-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W2/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W2/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W8/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W8/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W32/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W32/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W100/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W100/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W2/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W2/TransferFunction-8 125.0 ± 0% 125.0 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W8/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W8/TransferFunction-8 125.0 ± 0% 125.0 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W32/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W32/TransferFunction-8 125.0 ± 0% 125.0 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W100/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W100/TransferFunction-8 125.0 ± 0% 125.0 ± 0% ~ (p=1.000 n=10) ¹ +Bode-8 158.0 ± 0% 158.0 ± 0% ~ (p=1.000 n=10) ¹ +Zeros_SISO-8 102.0 ± 0% 102.0 ± 0% ~ (p=1.000 n=10) ¹ +Zeros_MIMO-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) ¹ +Zeros_NonSquare-8 63.00 ± 0% 63.00 ± 0% ~ (p=1.000 n=10) ¹ +ControllabilityStaircase-8 109.0 ± 0% 109.0 ± 0% ~ (p=1.000 n=10) ¹ +SimulateNoDelay-8 29.00 ± 0% 11.00 ± 0% -62.07% (p=0.000 n=10) +ThiranDelay-8 16.00 ± 0% 16.00 ± 0% ~ (p=1.000 n=10) ¹ +PadeDelay-8 16.00 ± 0% 16.00 ± 0% ~ (p=1.000 n=10) ¹ +DecomposeIODelay-8 7.000 ± 0% 7.000 ± 0% ~ (p=1.000 n=10) ¹ +PullDelaysToLFT-8 44.00 ± 0% 44.00 ± 0% ~ (p=1.000 n=10) ¹ +GetDelayModel-8 44.00 ± 0% 44.00 ± 0% ~ (p=1.000 n=10) ¹ +SetDelayModel-8 21.00 ± 0% 21.00 ± 0% ~ (p=1.000 n=10) ¹ +AbsorbInternalDelay-8 40.00 ± 0% 40.00 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeWithOpts_Thiran-8 72.00 ± 0% 72.00 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeWithOpts_IODelayThiran-8 81.00 ± 0% 81.00 ± 0% ~ (p=1.000 n=10) ¹ +FeedbackApproximatedDelays-8 82.00 ± 0% 82.00 ± 0% ~ (p=1.000 n=10) ¹ +SimulateInternalDelay-8 11.00 ± 0% 11.00 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponseWithDelay-8 87.00 ± 0% 87.00 ± 0% ~ (p=1.000 n=10) ¹ +PadeSystem-8 173.0 ± 0% 173.0 ± 0% ~ (p=1.000 n=10) ¹ +ZeroDelayApprox-8 26.00 ± 0% 26.00 ± 0% ~ (p=1.000 n=10) ¹ +IsStrictlyUpperTriangular-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponseLFT-8 17.00 ± 0% 17.00 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 45.00 ± 0% 11.00 ± 0% -75.56% (p=0.000 n=10) +FreqResponse_B747Lateral-8 72.00 ± 0% 72.00 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_MassSpringDamper-8 29.00 ± 0% 11.00 ± 0% -62.07% (p=0.000 n=10) +DiscretizeAndSimulate_B747Longitudinal-8 21.00 ± 0% 11.00 ± 0% -47.62% (p=0.000 n=10) +Simulate_Large-8 45.00 ± 0% 11.00 ± 0% -75.56% (p=0.000 n=10) +FeedbackAndSimulate-8 21.00 ± 0% 11.00 ± 0% -47.62% (p=0.000 n=10) +Bode_LargeMIMO-8 258.0 ± 0% 257.0 ± 0% ~ (p=0.170 n=10) +Lyap_N10-8 22.00 ± 0% 22.00 ± 0% ~ (p=1.000 n=10) ¹ +Lyap_N50-8 63.00 ± 0% 63.00 ± 0% ~ (p=1.000 n=10) ¹ +Lyap_N100-8 363.0 ± 0% 364.0 ± 0% +0.28% (p=0.000 n=10) +DLyap_N10-8 26.00 ± 0% 26.00 ± 0% ~ (p=1.000 n=10) ¹ +DLyap_N50-8 95.00 ± 0% 95.00 ± 0% ~ (p=1.000 n=10) ¹ +DLyap_N100-8 1.619k ± 0% 1.619k ± 0% ~ (p=1.000 n=10) +Care_N10_M2-8 37.00 ± 0% 37.00 ± 0% ~ (p=1.000 n=10) ¹ +Care_N50_M5-8 758.0 ± 0% 758.0 ± 0% ~ (p=1.000 n=10) ¹ +Care_N100_M5-8 2.067k ± 0% 2.024k ± 0% -2.08% (p=0.000 n=10) +Dare_N10_M2-8 34.00 ± 0% 34.00 ± 0% ~ (p=1.000 n=10) ¹ +Dare_N50_M5-8 781.0 ± 0% 781.0 ± 0% ~ (p=1.000 n=10) ¹ +Dare_N100_M5-8 4.053k ± 0% 4.004k ± 0% -1.22% (p=0.000 n=10) +Gram-8 59.00 ± 0% 59.00 ± 0% ~ (p=1.000 n=10) ¹ +Ctrb-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +H2Norm-8 56.00 ± 0% 56.00 ± 0% ~ (p=1.000 n=10) ¹ +HSV-8 93.00 ± 0% 93.00 ± 0% ~ (p=1.000 n=10) ¹ +HinfNorm-8 1.447k ± 0% 1.447k ± 0% ~ (p=1.000 n=10) +H2Syn_Simple-8 221.0 ± 0% 221.0 ± 0% ~ (p=1.000 n=10) ¹ +HinfSyn_Simple-8 3.107k ± 0% 3.107k ± 0% ~ (p=0.303 n=10) +Balreal-8 88.00 ± 0% 88.00 ± 0% ~ (p=1.000 n=10) ¹ +Balred-8 97.00 ± 0% 97.00 ± 0% ~ (p=1.000 n=10) ¹ +Place_N10_M2-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Place_N50_M5-8 75.00 ± 0% 75.00 ± 0% ~ (p=1.000 n=10) ¹ +Place_N100_M5-8 337.0 ± 0% 337.0 ± 0% ~ (p=1.000 n=10) ¹ +Acker_N5-8 19.00 ± 0% 19.00 ± 0% ~ (p=1.000 n=10) ¹ +Acker_N10-8 22.00 ± 0% 22.00 ± 0% ~ (p=1.000 n=10) ¹ +Lqr_N10_M2-8 37.00 ± 0% 37.00 ± 0% ~ (p=1.000 n=10) ¹ +Lqr_N50_M5-8 758.0 ± 0% 758.0 ± 0% ~ (p=1.000 n=10) ¹ +Lqr_N100_M5-8 2.066k ± 0% 2.017k ± 0% -2.40% (p=0.000 n=10) +Kalman_N10_M2_P3-8 103.0 ± 0% 103.0 ± 0% ~ (p=1.000 n=10) ¹ +Kalman_N50_M5_P5-8 2.191k ± 0% 2.191k ± 0% ~ (p=1.000 n=10) ¹ +Kalman_N100_M5_P5-8 4.337k ± 0% 4.277k ± 0% -1.39% (p=0.000 n=10) +Estim_N10_M2_P3-8 21.00 ± 0% 21.00 ± 0% ~ (p=1.000 n=10) ¹ +Estim_N50_M5_P5-8 21.00 ± 0% 21.00 ± 0% ~ (p=1.000 n=10) ¹ +Estim_N100_M5_P5-8 31.00 ± 0% 21.00 ± 0% -32.26% (p=0.000 n=10) +Reg_N10_M2_P3-8 25.00 ± 0% 25.00 ± 0% ~ (p=1.000 n=10) ¹ +Reg_N50_M5_P5-8 25.00 ± 0% 25.00 ± 0% ~ (p=1.000 n=10) ¹ +Reg_N100_M5_P5-8 55.00 ± 0% 25.00 ± 0% -54.55% (p=0.000 n=10) +PolyRoots_N10-8 41.00 ± 0% 41.00 ± 0% ~ (p=1.000 n=10) ¹ +ZPKEval_SISO-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +ZPKFreqResponse_SISO_100-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +ZPKToTF_SISO_N10-8 21.00 ± 0% 21.00 ± 0% ~ (p=1.000 n=10) ¹ +TFToZPK_SISO_N10-8 90.00 ± 0% 90.00 ± 0% ~ (p=1.000 n=10) ¹ +SSToZPK_SISO-8 130.0 ± 0% 130.0 ± 0% ~ (p=1.000 n=10) ¹ +ZPKToSS_SISO-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +PolyFromComplexRoots_N20-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +Sigma_SISO-8 72.00 ± 0% 72.00 ± 0% ~ (p=1.000 n=10) ¹ +Sigma_MIMO-8 85.00 ± 0% 85.00 ± 0% ~ (p=1.000 n=10) ¹ +Nichols-8 74.00 ± 0% 74.00 ± 0% ~ (p=1.000 n=10) ¹ +Nyquist-8 96.00 ± 0% 96.00 ± 0% ~ (p=1.000 n=10) ¹ +FreqRespEst_SISO-8 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹ +FreqRespEst_MIMO-8 17.00 ± 0% 17.00 ± 0% ~ (p=1.000 n=10) ¹ +BlkDiag-8 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹ +Connect-8 38.00 ± 0% 38.00 ± 0% ~ (p=1.000 n=10) ¹ +LFT-8 74.00 ± 0% 74.00 ± 0% ~ (p=1.000 n=10) ¹ +LFT_Large-8 74.00 ± 0% 74.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N2-8 46.00 ± 0% 46.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N5-8 48.00 ± 0% 48.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N20-8 50.00 ± 0% 50.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N50-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) +D2C_Tustin_N20-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N20-8 30.00 ± 0% 30.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N50-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) +DCGain_StableMIMO_N10_M4_P6-8 13.00 ± 0% 13.00 ± 0% ~ (p=1.000 n=10) ¹ +DCGain_IntegratorMIMO_N10_M4_P6-8 33.00 ± 0% 33.00 ± 0% ~ (p=1.000 n=10) ¹ +DCGain_IntegratorMIMO_N40_M8_P8-8 34.00 ± 0% 34.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_200-8 60.00 ± 0% 60.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_2000-8 60.00 ± 0% 60.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_10000-8 60.50 ± 1% 61.00 ± 0% +0.83% (p=0.033 n=10) +SystemFRD_MIMO_200-8 120.0 ± 0% 120.0 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_MIMO_2000-8 125.0 ± 2% 124.0 ± 2% ~ (p=0.206 n=10) +SystemFRD_MIMO_10000-8 129.0 ± 2% 129.0 ± 1% ~ (p=1.000 n=10) +SystemFRD_Large_2000-8 211.0 ± 0% 210.5 ± 0% ~ (p=0.215 n=10) +FRDSigma_SISO_200-8 3.000 ± 0% 3.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_SISO_2000-8 3.000 ± 0% 3.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO_200-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO_2000-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO_10000-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_Large_2000-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_10000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_NegGM_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO5x5_2000-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_SISO_200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_SISO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_MIMO_200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_MIMO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_MIMO_10000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDParallel_SISO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDParallel_MIMO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_SISO_200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_SISO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO_200-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO_2000-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO_10000-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO8x8_2000-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDAbs_MIMO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSelectFrequencies_MIMO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDPeakGain_MIMO_2000-8 6.000 ± 0% 6.000 ± 0% ~ (p=1.000 n=10) ¹ +ModelArrayFreqResponse_MIMO_16x200-8 1.620k ± 0% 1.620k ± 0% ~ (p=0.582 n=10) +ModelArrayFreqResponseManualLoop_MIMO_16x200-8 1.614k ± 0% 1.615k ± 0% ~ (p=0.179 n=10) +Step_SISO_N2-8 54.00 ± 0% 54.00 ± 0% ~ (p=1.000 n=10) ¹ +Step_SISO_N10-8 101.00 ± 0% 73.00 ± 0% -27.72% (p=0.000 n=10) +Step_SISO_N50-8 252.0 ± 1% 134.0 ± 1% -46.83% (p=0.000 n=10) +Step_MIMO_N10-8 62.00 ± 0% 62.00 ± 0% ~ (p=1.000 n=10) ¹ +StepInfo_SISO_N10-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +StepInfo_MIMO_N10-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +ModelArrayStep_MIMO_16-8 883.0 ± 0% 882.5 ± 0% ~ (p=1.000 n=10) +ModelArrayStepManualLoop_MIMO_16-8 877.0 ± 0% 877.0 ± 0% ~ (p=0.121 n=10) +Impulse_SISO_N2-8 54.00 ± 0% 54.00 ± 0% ~ (p=1.000 n=10) ¹ +Impulse_SISO_N10-8 101.00 ± 0% 73.00 ± 0% -27.72% (p=0.000 n=10) +Impulse_SISO_N50-8 252.0 ± 0% 134.0 ± 0% -46.83% (p=0.000 n=10) +Impulse_MIMO_N10-8 62.00 ± 0% 62.00 ± 0% ~ (p=1.000 n=10) ¹ +Lsim_SISO_N2-8 58.00 ± 0% 40.00 ± 0% -31.03% (p=0.000 n=10) +Lsim_SISO_N10-8 60.00 ± 0% 42.00 ± 0% -30.00% (p=0.000 n=10) +Lsim_SISO_N50-8 62.00 ± 0% 44.00 ± 0% -29.03% (p=0.000 n=10) +Lsim_MIMO_N10-8 60.00 ± 0% 42.00 ± 0% -30.00% (p=0.000 n=10) +Lsim_SISO_1e4-8 361.00 ± 0% 43.00 ± 0% -88.09% (p=0.000 n=10) +Lsim_MIMO_1e4-8 368.00 ± 0% 46.50 ± 1% -87.36% (p=0.000 n=10) +Lsim_Discrete_SISO-8 48.00 ± 0% 14.00 ± 0% -70.83% (p=0.000 n=10) +Loopsens_SISO_N2-8 227.0 ± 0% 227.0 ± 0% ~ (p=1.000 n=10) ¹ +Loopsens_SISO_N10-8 227.0 ± 0% 227.0 ± 0% ~ (p=1.000 n=10) ¹ +Loopsens_MIMO_N10-8 227.0 ± 0% 227.0 ± 0% ~ (p=1.000 n=10) ¹ +Canon_Modal_N2-8 36.00 ± 0% 36.00 ± 0% ~ (p=1.000 n=10) ¹ +Canon_Modal_N10-8 54.00 ± 0% 54.00 ± 0% ~ (p=1.000 n=10) ¹ +Canon_Modal_N50-8 113.0 ± 1% 113.0 ± 1% ~ (p=1.000 n=10) +Canon_Modal_N100-8 2.015k ± 0% 2.014k ± 0% ~ (p=0.590 n=10) +Canon_Comp_N2-8 49.00 ± 0% 49.00 ± 0% ~ (p=1.000 n=10) ¹ +Canon_Comp_N10-8 100.0 ± 0% 100.0 ± 0% ~ (p=1.000 n=10) ¹ +DescriptorToExplicit_N10-8 22.00 ± 0% 22.00 ± 0% ~ (p=1.000 n=10) ¹ +DescriptorFreqResponse_MIMO_N10x200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +DescriptorFreqResponse_MIMO_N50x200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FixedInputReduction_N10-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +TunableGainCurrentSystem_4x4-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +TunableGainSampleCurrentSystem_4x4-8 30.00 ± 0% 30.00 ± 0% ~ (p=1.000 n=10) ¹ +GeneralizedCurrentSystem_SISO-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +GeneralizedClosedLoop_SISO-8 68.00 ± 0% 68.00 ± 0% ~ (p=1.000 n=10) ¹ +TuningGoalWeightedGain_SISO-8 82.00 ± 0% 82.00 ± 0% ~ (p=1.000 n=10) ¹ +TuningGoalWeightedGain_MIMO-8 113.0 ± 0% 113.0 ± 0% ~ (p=1.000 n=10) ¹ +TuningGoalDynamicWeightedGain_MIMO-8 247.0 ± 0% 247.0 ± 0% ~ (p=1.000 n=10) ¹ +Systune_SISO-8 688.0 ± 0% 688.0 ± 0% ~ (p=1.000 n=10) +Systune_MIMO-8 1.287k ± 0% 1.286k ± 0% -0.08% (p=0.003 n=10) +PhysicalAssembly_8Components-8 306.0 ± 0% 306.0 ± 0% ~ (p=1.000 n=10) ¹ +ModalTruncate_N50_Order10-8 156.0 ± 0% 156.0 ± 0% ~ (p=1.000 n=10) ¹ +Passivity_SISO-8 63.00 ± 0% 63.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDPassivity_MIMO-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N2-8 55.00 ± 0% 55.00 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N10-8 79.00 ± 0% 79.00 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N50-8 157.0 ± 1% 156.0 ± 1% ~ (p=0.179 n=10) +Stabsep_N100-8 480.0 ± 0% 480.5 ± 0% ~ (p=0.738 n=10) +Modsep_N10-8 79.00 ± 0% 79.00 ± 0% ~ (p=1.000 n=10) ¹ +Modsep_N50-8 144.0 ± 0% 143.0 ± 1% ~ (p=0.057 n=10) +Ssbal_N2-8 12.00 ± 0% 12.00 ± 0% ~ (p=1.000 n=10) ¹ +Ssbal_N10-8 13.00 ± 0% 13.00 ± 0% ~ (p=1.000 n=10) ¹ +Ssbal_N50-8 13.00 ± 0% 13.00 ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N2-8 19.00 ± 0% 19.00 ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N10-8 20.00 ± 0% 20.00 ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N50-8 20.00 ± 0% 20.00 ± 0% ~ (p=1.000 n=10) ¹ +Sminreal_N2-8 9.000 ± 0% 9.000 ± 0% ~ (p=1.000 n=10) ¹ +Sminreal_N10-8 11.00 ± 0% 11.00 ± 0% ~ (p=1.000 n=10) ¹ +Sminreal_N50-8 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹ +Inv_SISO_N2-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Inv_SISO_N10-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Inv_MIMO_N10-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N2-8 29.00 ± 0% 29.00 ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N10-8 26.00 ± 0% 26.00 ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N50-8 83.00 ± 0% 83.00 ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N100-8 939.0 ± 0% 939.0 ± 0% ~ (p=1.000 n=10) ¹ +Covar_MIMO_N10-8 26.00 ± 0% 26.00 ± 0% ~ (p=1.000 n=10) ¹ +Pidtune_PI-8 94.00 ± 0% 94.00 ± 0% ~ (p=1.000 n=10) ¹ +Pidtune_PID-8 94.00 ± 0% 94.00 ± 0% ~ (p=1.000 n=10) ¹ +Pidtune_PIDF-8 94.00 ± 0% 94.00 ± 0% ~ (p=1.000 n=10) ¹ +Margin_SISO-8 85.00 ± 0% 85.00 ± 0% ~ (p=1.000 n=10) ¹ +Bandwidth_SISO-8 71.00 ± 0% 71.00 ± 0% ~ (p=1.000 n=10) ¹ +DiskMargin_SISO-8 97.00 ± 0% 97.00 ± 0% ~ (p=1.000 n=10) ¹ +geomean ² -6.59% ² +¹ all samples are equal +² summaries must be >0 to compute geomean diff --git a/docs/benchmarks/gonum-v0.19.0/full-candidate.txt.gz b/docs/benchmarks/gonum-v0.19.0/full-candidate.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..a60a85a777e1ce8a54a88cd6beca39f2651ff306 GIT binary patch literal 29572 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 literal 0 HcmV?d00001 diff --git a/docs/benchmarks/gonum-v0.19.0/metadata.json b/docs/benchmarks/gonum-v0.19.0/metadata.json new file mode 100644 index 0000000..aa193dd --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/metadata.json @@ -0,0 +1,128 @@ +{ + "status": "complete", + "flags": [ + "-test.run=^$", + "-test.bench=.", + "-test.benchtime=100ms", + "-test.benchmem", + "-test.count=1" + ], + "rounds": 10, + "timeout_seconds": 600.0, + "runtime_environment": { + "GOMAXPROCS": "8", + "GODEBUG": null, + "GOGC": null, + "GOMEMLIMIT": null + }, + "binaries": { + "baseline": { + "sha256": "b14e292dc7e7b84f9e2c7c90dcbb1e77ea005152b32e0626ee77030d39dbbf2f" + }, + "candidate": { + "sha256": "0e52b094ef36ca5e9f415fa8a9a1b4f3a91cc32d2528fa89a21e1fe77129f81a" + } + }, + "runs": [ + { + "round": 1, + "label": "baseline", + "status": "complete" + }, + { + "round": 1, + "label": "candidate", + "status": "complete" + }, + { + "round": 2, + "label": "candidate", + "status": "complete" + }, + { + "round": 2, + "label": "baseline", + "status": "complete" + }, + { + "round": 3, + "label": "baseline", + "status": "complete" + }, + { + "round": 3, + "label": "candidate", + "status": "complete" + }, + { + "round": 4, + "label": "candidate", + "status": "complete" + }, + { + "round": 4, + "label": "baseline", + "status": "complete" + }, + { + "round": 5, + "label": "baseline", + "status": "complete" + }, + { + "round": 5, + "label": "candidate", + "status": "complete" + }, + { + "round": 6, + "label": "candidate", + "status": "complete" + }, + { + "round": 6, + "label": "baseline", + "status": "complete" + }, + { + "round": 7, + "label": "baseline", + "status": "complete" + }, + { + "round": 7, + "label": "candidate", + "status": "complete" + }, + { + "round": 8, + "label": "candidate", + "status": "complete" + }, + { + "round": 8, + "label": "baseline", + "status": "complete" + }, + { + "round": 9, + "label": "baseline", + "status": "complete" + }, + { + "round": 9, + "label": "candidate", + "status": "complete" + }, + { + "round": 10, + "label": "candidate", + "status": "complete" + }, + { + "round": 10, + "label": "baseline", + "status": "complete" + } + ] +} diff --git a/docs/benchmarks/gonum-v0.19.0/subcase-baseline.txt.gz b/docs/benchmarks/gonum-v0.19.0/subcase-baseline.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..5ad54ec4da8c80a918206a262936e0d2e05add77 GIT binary patch literal 293 zcmV+=0owi_iwFP!00002|J~HRPQx$|2k^Om3cmm(as74K+Mx>qRSFU#GR7on6WiE{ zs=hs`AVKZMMskvev%LKDzjNta%<;Plr`n>@si3PItI%?a{ISe&S$9?ccCTHV98_y! zcZfdG&UV2y@f?x%eU3NYHwHgucpn_v8mp^Th2t)m&wgmm#mN}|V1hMGOrGfL3rU`X zvhl-&U2k<)J9{VbSgYZzIY_$t?t!Ng+n6|ixuA?@5^sOHp@hJyX`H@1K>JNmpn>r( zO_GXqG|?Lq$>wR|AYe2x3fDRDd71$34l$eG+V|#aVkd>Az~5xB!+>T ra?02uauS^Wng}e!B&K~La5H;ko+e-^pG=JW>EHVTaDjiZM+g7_J>HEO literal 0 HcmV?d00001 diff --git a/docs/benchmarks/gonum-v0.19.0/subcase-benchstat.txt b/docs/benchmarks/gonum-v0.19.0/subcase-benchstat.txt new file mode 100644 index 0000000..d49cc13 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/subcase-benchstat.txt @@ -0,0 +1,16 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro + │ baseline.txt │ candidate.txt │ + │ sec/op │ sec/op vs base │ +FrequencySweepKernels/N4_W2/TransferFunction-8 9.322µ ± 2% 9.433µ ± 2% ~ (p=0.447 n=10) + + │ baseline.txt │ candidate.txt │ + │ B/op │ B/op vs base │ +FrequencySweepKernels/N4_W2/TransferFunction-8 44.35Ki ± 0% 44.35Ki ± 0% ~ (p=0.620 n=10) + + │ baseline.txt │ candidate.txt │ + │ allocs/op │ allocs/op vs base │ +FrequencySweepKernels/N4_W2/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +¹ all samples are equal diff --git a/docs/benchmarks/gonum-v0.19.0/subcase-candidate.txt.gz b/docs/benchmarks/gonum-v0.19.0/subcase-candidate.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..a4fa0b05c59d64d3d1a846d63100868e45d245d7 GIT binary patch literal 303 zcmV+~0nq**iwFP!00002|J{|nZi6rsh3D`Tet{OSFaBXmhAdU9NL1=rxsD4YV7oRb z%G;Nyg@_EDORnVMSYAGzdyY$MLyq>+pK248R(e(CNcxsS Date: Sat, 12 Sep 2026 18:33:16 -0500 Subject: [PATCH 3/4] chore: validate Gonum upgrade with Go 1.27.1 --- .github/workflows/ci.yml | 2 +- .../issue10-investigation/README.md | 185 ++++++++++++++++++ .../allocator-go1.27.1/allocator_default.txt | 140 +++++++++++++ .../allocator-go1.27.1/benchstat.txt | 44 +++++ .../allocator-go1.27.1/metadata.json | 75 +++++++ .../allocator-go1.27.1/nosizemalloc.txt | 140 +++++++++++++ .../bisect-go1.26.4/benchstat.txt | 25 +++ .../bisect-go1.26.4/calibrated.txt | 80 ++++++++ .../bisect-go1.26.4/merge.txt | 80 ++++++++ .../bisect-go1.26.4/metadata.json | 165 ++++++++++++++++ .../bisect-go1.26.4/new.txt | 80 ++++++++ .../bisect-go1.26.4/new_align64.txt | 80 ++++++++ .../bisect-go1.26.4/old.txt | 80 ++++++++ .../bisect-go1.26.4/old_align64.txt | 80 ++++++++ .../bisect-go1.26.4/worker.txt | 80 ++++++++ .../issue10-investigation/code-comparison.txt | 36 ++++ .../go1.26.4/benchstat.txt | 43 ++++ .../issue10-investigation/go1.26.4/master.txt | 140 +++++++++++++ .../go1.26.4/metadata.json | 93 +++++++++ .../issue10-investigation/go1.26.4/new.txt | 140 +++++++++++++ .../issue10-investigation/go1.26.4/old.txt | 140 +++++++++++++ .../go1.27.1/benchstat.txt | 43 ++++ .../issue10-investigation/go1.27.1/master.txt | 140 +++++++++++++ .../go1.27.1/metadata.json | 129 ++++++++++++ .../issue10-investigation/go1.27.1/new.txt | 140 +++++++++++++ .../go1.27.1/no_gemm.txt | 140 +++++++++++++ .../go1.27.1/no_gemv.txt | 140 +++++++++++++ .../issue10-investigation/go1.27.1/old.txt | 140 +++++++++++++ .../issue10-investigation/matlog-trace.txt | 14 ++ .../issue10-investigation/profiles/new.pprof | Bin 0 -> 10175 bytes .../issue10-investigation/profiles/old.pprof | Bin 0 -> 10412 bytes .../issue10-investigation/run.py | 117 +++++++++++ go.mod | 2 +- model_array.go | 11 +- 34 files changed, 2938 insertions(+), 6 deletions(-) create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/README.md create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/allocator_default.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/metadata.json create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/nosizemalloc.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/calibrated.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/merge.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/metadata.json create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/new.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/new_align64.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/old.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/old_align64.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/worker.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/code-comparison.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/master.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/metadata.json create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/new.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/old.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/master.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/metadata.json create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/new.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/no_gemm.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/no_gemv.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/old.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/matlog-trace.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/profiles/new.pprof create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/profiles/old.pprof create mode 100644 docs/benchmarks/gonum-v0.19.0/issue10-investigation/run.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4725a66..4084822 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,7 @@ name: CI on: [push, pull_request] env: - GO_VERSION: '1.26.3' + GO_VERSION: '1.27.1' jobs: test: runs-on: ubuntu-latest diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/README.md b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/README.md new file mode 100644 index 0000000..3254e9a --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/README.md @@ -0,0 +1,185 @@ +# Issue #10: arm64 regression investigation + +Investigated 2026-09-12 on Apple M1 Pro (darwin/arm64), GOMAXPROCS=8. +[Issue #10](https://github.com/jamestjsp/gonum/issues/10) reports downstream +regressions between v0.17.7-fork and v0.19.0-fork. + +## Findings + +The large Go 1.26.4 regressions reproduce. Their first substantial increase is +at `ebe982daa841625254b141121265738410ba42ee`, the worker-aware DGEMM dispatch +change. The immediately preceding commit `7fd5fefe` does not show the large +slowdowns. The subsequent Darwin threshold calibration preserves them. + +The evidence strongly supports executable-layout sensitivity, not an incorrect +parallel-work threshold: + +- The MatLog_N50 trace contains no Dgemv calls, including setup. Its GEMM shapes + are 51×51×51 (setup), 50×50×50 and 36×36×64. All remain serial under both + releases because they occupy fewer than four output tiles. +- Triangular solves include a 64×36 panel with lda=ldb=100 and a 100×50 solve + with lda=100, ldb=50. Dtrsm source is unchanged between releases. Normalized + disassembly has the same 888 instructions and identical hot-body operations; + differing operands are addresses of panic strings/types in cold paths. + Dtrsm starts at 0x100127980 in the original baseline executable and + 0x100128410 in the candidate, changing its position modulo 64 from 0 to 16. + Other unchanged functions move too. This does not identify Dtrsm alone as + the cause of the whole-program effect. +- Relinking the same Go 1.26.4 code with `-ldflags=-funcalign=64` removes almost + all of the three largest regressions. This changes layout without reverting + dispatch, changing arithmetic, or undoing the scaling fixes. +- With default Go 1.27.1 builds, none of the seven reported regression cases + has a statistically significant slowdown in this ten-sample follow-up. + Absence of significance is not proof of equivalence; smaller effects and + other workloads remain possible. + +No production numerical code was changed. Go 1.27.1 was installed as the host's +default toolchain. The older Go 1.26.4 installation was preserved for diagnosis. +The global alignment flag is an experiment, not a proposed build requirement. +The issue remains reproducible with the older compiler's default layout. + +## Reproduction and bisection + +All entries below are medians from ten interleaved samples per binary. +The release reproduction uses 300ms per case; bisection uses 200ms. + +| Benchmark | Go 1.26.4 old release | New release | Change | +| --- | ---: | ---: | ---: | +| MatLog_N50 | 335.2 us | 377.7 us | +12.67% | +| D2C_ZOH_N50 | 413.1 us | 453.2 us | +9.69% | +| Stabsep_N100 | 9.030 ms | 9.626 ms | +6.60% | +| Reduce | 46.47 us | 49.19 us | +5.85% | +| DiscretizeZOH | 21.35 us | 22.58 us | +5.74% | +| Modsep_N50 | 1.453 ms | 1.535 ms | +5.63% | + +All six comparisons have p≤0.005. The FRD timing regression did not reproduce +(p=0.579), although its median allocation count rose from 60 to 61. Current +master also reproduces the large timing regressions with Go 1.26.4. + +| Go 1.26.4 revision/build | MatLog_N50 | D2C_ZOH_N50 | Stabsep_N100 | +| --- | ---: | ---: | ---: | +| Old release `f43007ad` | 327.7 us | 409.2 us | 8.857 ms | +| Merge `7fd5fefe` | 330.1 us | 411.9 us | 8.846 ms | +| Worker-aware gate `ebe982da` | 370.1 us | 450.3 us | 9.398 ms | +| Darwin calibration `777029ff` | 369.5 us | 450.2 us | 9.452 ms | +| New release `a78cf83e` | 369.7 us | 451.1 us | 9.421 ms | +| Old release, function alignment 64 | 327.1 us | 408.2 us | 8.892 ms | +| New release, function alignment 64 | 329.2 us | 410.6 us | 8.874 ms | + +`bisect-go1.26.4/benchstat.txt` contains all uncertainty and allocation results. +This is attribution of the trigger in these executables, not evidence that +changing the threshold back is the appropriate repair. GEMM reversion loses the +confirmed simulation and regulator gains. + +## Go 1.27.1 and allocation specialization + +Both release endpoints and current master were rebuilt with Go 1.27.1. +The five-way comparison also includes isolated reversions of the old Dgemv +implementation and old dgemm.go into the new release. These are experimental +ablation builds, not proposed source changes. + +| Benchmark | Old release | New release | Current master | +| --- | ---: | ---: | ---: | +| MatLog_N50 | 335.4 us | 340.0 us | 338.7 us | +| D2C_ZOH_N50 | 416.1 us | 418.7 us | 419.1 us | +| Stabsep_N100 | 8.672 ms | 8.697 ms | 8.674 ms | +| Simulate_DCMotor | 44.44 us | 38.12 us | 37.99 us | +| Reg_N100_M5_P5 | 80.56 us | 61.20 us | 60.60 us | + +The new release retains the simulation improvement (-14.22%) and regulator +improvement (-24.02%), with the same 45→11 and 55→25 allocation reductions +observed under Go 1.26.4. These allocation-count changes come from the Gonum +comparison, not from installing the new compiler. Some smaller allocation +increases remain; consult the complete tables rather than timing alone. + +Go 1.27 adds size-specialized allocation calls for small objects; see the +[official release notes](https://go.dev/doc/go1.27#runtime). A separate paired +comparison uses identical new-release source with the feature enabled by +default and disabled with `GOEXPERIMENT=nosizespecializedmalloc`: + +- Disabled Reduce is 1.88% slower (p<0.001): the default feature helps this case. +- Disabled MatLog and D2C are 1.25% and 1.41% faster (p<0.001). +- Stabsep is inconclusive (p=0.579); other results are in + `allocator-go1.27.1/benchstat.txt`. + +The feature therefore does not explain the disappearance of the large original +regressions. Toggling it changes emitted code/layout as well as allocation +calls, so these are whole-program effects, not isolated allocator timings. +No persistent GOEXPERIMENT override was set. + +## Evidence and limitations + +- `go1.26.4/`: original three-way release/master comparison, 10×300ms. +- `go1.27.1/`: five-way release/master/ablation comparison, 10×300ms. +- `allocator-go1.27.1/`: allocator default versus disabled, 10×300ms. +- `bisect-go1.26.4/`: five commit states plus two alignment builds, 10×200ms. +- Each directory contains full raw output, benchstat results, binary SHA-256 + hashes, resolved commits, toolchain versions and alternating run order. +- `matlog-trace.txt`: instrumented one-iteration call-shape trace, including + untimed fixture setup. Its timing is not performance evidence. +- `code-comparison.txt`: normalized instruction-count and address diagnostics. + The reported diff counts include cold panic-address materialization. +- `profiles/`: separate five-second MatLog CPU profiles with Go 1.26.4. The + macOS profiles are dominated by runtime/system samples and are not used to + make a quantitative CPU attribution. + +The unchanged controlsys fixture source is commit +`54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4`; all comparisons replace only its +Gonum dependency. The Gonum endpoints are commits, not annotated tag objects: +`f43007ad8a2d208bc8f47c338e85f05381d9643b` and +`a78cf83eff160df0e423b08af0c7642ade964150`. Current master is +`1c42629c5cb53235d9ae074bb1be6da6471771da`. + +Benchstat: `golang.org/x/perf v0.0.0-20260312031701-16a31bc5fbd0`. + +Normal desktop host, no affinity or power-state control; native default Go +BLAS/LAPACK, no build tags or PGO. All binaries in a timed comparison were +prebuilt, with no concurrent builds, tests or profiling. The interrupted +Go 1.26.4 ablation run was discarded. Comparisons across the two toolchains' +separate sessions are descriptive; each source/feature comparison within a +session is interleaved. No other platforms or worker counts were measured. +This focused investigation does not replace the original 236-case suite or +establish a regression-free release on all workloads. + +## Run again + +Requires Python 3.12+, Go, and local repositories containing the pinned commits. +The harness uses fresh snapshots and refuses to overwrite its output directory. +It checks exit status and matching nonempty benchmark sets. Builds finish before +any timed runs. Use an absolute older Go executable for the old-toolchain test; +do not change the host default back. + +```sh +uv run python3 docs/benchmarks/gonum-v0.19.0/issue10-investigation/run.py \ + --gonum /path/to/gonum \ + --controlsys /path/to/controlsys --go /path/to/go1.27.1/bin/go \ + --suite releases --output /tmp/issue10-releases +uv run python3 docs/benchmarks/gonum-v0.19.0/issue10-investigation/run.py \ + --gonum /path/to/gonum \ + --controlsys /path/to/controlsys --go /path/to/go1.27.1/bin/go \ + --suite allocator --output /tmp/issue10-allocator +uv run python3 docs/benchmarks/gonum-v0.19.0/issue10-investigation/run.py \ + --gonum /path/to/gonum \ + --controlsys /path/to/controlsys --go /path/to/go1.26.4/bin/go \ + --suite bisect --benchtime 200ms --output /tmp/issue10-bisect +benchstat /tmp/issue10-releases/old.txt /tmp/issue10-releases/new.txt +``` + +The new `BenchmarkDtrsmSmallRectangular` in `blas/gonum/dtrsmbench_test.go` +provides bounded, known-solution coverage for the traced solve shapes. It times +RHS restoration plus the public solve and validates the fixture outside timing. +It is a kernel guardrail, not a replacement for the downstream executable when +investigating layout sensitivity. + +Validation on Go 1.27.1: + +- `go test ./blas/gonum ./lapack/gonum ./mat` passed. +- The unchanged controlsys snapshot with current Gonum master passed `go test ./...`. +- All four new benchmark fixtures passed a one-iteration smoke check, with zero + timed allocations. These single samples are not performance claims. +- The retained harness completed its allocator suite with one iteration per + benchmark and one round; this is a functionality check, excluded from tables. + +This directory preserves the local Gonum investigation for the downstream PR. +The original Gonum checkout and its uncommitted benchmark are unchanged. +Pass `--gonum` explicitly when running the copied harness from controlsys. diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/allocator_default.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/allocator_default.txt new file mode 100644 index 0000000..63f33a7 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/allocator_default.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7230 44872 ns/op 53696 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 17005 21371 ns/op 22177 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9434 37890 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6045 60636 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 855 417976 ns/op 473914 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1065 336698 ns/op 400641 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1635 227260 ns/op 944777 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8658854 ns/op 2671982 B/op 484 allocs/op +BenchmarkModsep_N50-8 250 1430081 ns/op 654050 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6832 45318 ns/op 53696 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16935 21241 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9492 38477 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6328 56243 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 859 418507 ns/op 475180 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1069 335306 ns/op 400177 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1318 232854 ns/op 944791 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8768819 ns/op 2675663 B/op 483 allocs/op +BenchmarkModsep_N50-8 250 1428283 ns/op 656477 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7074 44874 ns/op 53699 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16378 21285 ns/op 22188 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9597 37915 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5518 59593 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 866 419836 ns/op 474883 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1080 334665 ns/op 400196 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1680 233854 ns/op 944772 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8654393 ns/op 2658799 B/op 484 allocs/op +BenchmarkModsep_N50-8 252 1427349 ns/op 655257 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7168 45046 ns/op 53688 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16905 21327 ns/op 22180 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9435 38011 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5794 60539 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 856 416440 ns/op 474795 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1075 334857 ns/op 400185 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1554 230307 ns/op 944810 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8638154 ns/op 2665182 B/op 483 allocs/op +BenchmarkModsep_N50-8 250 1427739 ns/op 654806 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7166 44971 ns/op 53680 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16833 21749 ns/op 22182 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9601 37863 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6018 58503 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 856 418911 ns/op 474790 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1074 335725 ns/op 400148 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1436 226876 ns/op 944793 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8722667 ns/op 2658675 B/op 484 allocs/op +BenchmarkModsep_N50-8 249 1426503 ns/op 655502 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6991 44928 ns/op 53688 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16866 21149 ns/op 22182 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9517 37908 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6025 56855 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 864 417210 ns/op 473983 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1074 334585 ns/op 400426 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1539 228773 ns/op 944794 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8650460 ns/op 2675617 B/op 485 allocs/op +BenchmarkModsep_N50-8 252 1426096 ns/op 656794 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6870 45599 ns/op 53688 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16881 21239 ns/op 22183 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9496 37971 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6020 59540 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 847 415640 ns/op 475291 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1064 333731 ns/op 400229 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1645 224503 ns/op 944810 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8646579 ns/op 2655853 B/op 483 allocs/op +BenchmarkModsep_N50-8 252 1424473 ns/op 654574 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6980 44591 ns/op 53693 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16879 21206 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9452 37995 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6330 59964 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 861 421026 ns/op 474652 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1075 334884 ns/op 400268 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1542 227836 ns/op 944792 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8753455 ns/op 2652317 B/op 483 allocs/op +BenchmarkModsep_N50-8 252 1428466 ns/op 657322 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6864 45421 ns/op 53687 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15499 22806 ns/op 22191 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8998 39171 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 4894 65865 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 810 515241 ns/op 473766 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1022 335764 ns/op 400193 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1442 230829 ns/op 944761 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8641434 ns/op 2659031 B/op 483 allocs/op +BenchmarkModsep_N50-8 250 1432305 ns/op 659343 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6930 45455 ns/op 53675 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 17013 21183 ns/op 22187 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9568 38085 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6236 59404 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 860 417084 ns/op 473818 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1076 336443 ns/op 400392 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1532 230992 ns/op 944789 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8689293 ns/op 2649934 B/op 483 allocs/op +BenchmarkModsep_N50-8 249 1428184 ns/op 654527 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/benchstat.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/benchstat.txt new file mode 100644 index 0000000..8501bc5 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/benchstat.txt @@ -0,0 +1,44 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro + │ allocator_default.txt │ nosizemalloc.txt │ + │ sec/op │ sec/op vs base │ +Reduce-8 45.01µ ± 1% 45.85µ ± 1% +1.88% (p=0.000 n=10) +DiscretizeZOH-8 21.26µ ± 2% 21.40µ ± 1% ~ (p=0.436 n=10) +Simulate_DCMotor-8 37.98µ ± 1% 37.88µ ± 0% -0.28% (p=0.023 n=10) +Reg_N100_M5_P5-8 59.57µ ± 5% 59.52µ ± 3% ~ (p=0.684 n=10) +D2C_ZOH_N50-8 418.2µ ± 1% 412.3µ ± 0% -1.41% (p=0.000 n=10) +MatLog_N50-8 335.1µ ± 0% 330.9µ ± 0% -1.25% (p=0.000 n=10) +SystemFRD_SISO_10000-8 229.5µ ± 1% 227.2µ ± 5% ~ (p=0.631 n=10) +Stabsep_N100-8 8.657m ± 1% 8.667m ± 0% ~ (p=0.579 n=10) +Modsep_N50-8 1.428m ± 0% 1.423m ± 0% -0.32% (p=0.000 n=10) +geomean 211.9µ 211.5µ -0.19% + + │ allocator_default.txt │ nosizemalloc.txt │ + │ B/op │ B/op vs base │ +Reduce-8 52.43Ki ± 0% 52.44Ki ± 0% ~ (p=0.092 n=10) +DiscretizeZOH-8 21.66Ki ± 0% 21.66Ki ± 0% ~ (p=0.144 n=10) +Simulate_DCMotor-8 16.28Ki ± 0% 16.28Ki ± 0% ~ (p=1.000 n=10) ¹ +Reg_N100_M5_P5-8 421.4Ki ± 0% 421.4Ki ± 0% ~ (p=0.721 n=10) +D2C_ZOH_N50-8 463.6Ki ± 0% 463.4Ki ± 0% ~ (p=0.315 n=10) +MatLog_N50-8 390.8Ki ± 0% 391.0Ki ± 0% ~ (p=0.684 n=10) +SystemFRD_SISO_10000-8 922.6Ki ± 0% 922.6Ki ± 0% ~ (p=0.447 n=10) +Stabsep_N100-8 2.536Mi ± 1% 2.534Mi ± 0% ~ (p=0.247 n=10) +Modsep_N50-8 640.0Ki ± 0% 641.1Ki ± 0% ~ (p=0.218 n=10) +geomean 234.7Ki 234.8Ki +0.01% +¹ all samples are equal + + │ allocator_default.txt │ nosizemalloc.txt │ + │ allocs/op │ allocs/op vs base │ +Reduce-8 170.0 ± 0% 170.0 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeZOH-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 11.00 ± 0% 11.00 ± 0% ~ (p=1.000 n=10) ¹ +Reg_N100_M5_P5-8 25.00 ± 0% 25.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N50-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N50-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_10000-8 61.00 ± 0% 61.00 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N100-8 483.0 ± 0% 483.0 ± 0% ~ (p=0.065 n=10) +Modsep_N50-8 143.0 ± 0% 143.0 ± 0% ~ (p=1.000 n=10) +geomean 59.50 59.50 +0.00% +¹ all samples are equal diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/metadata.json b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/metadata.json new file mode 100644 index 0000000..b272c18 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/metadata.json @@ -0,0 +1,75 @@ +{ + "date": "2026-09-12", + "cpu": "Apple M1 Pro", + "GOOS": "darwin", + "GOARCH": "arm64", + "GOMAXPROCS": 8, + "rounds": 10, + "benchtime": "300ms", + "controlsys_commit": "54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4", + "build_flags": "default unless noted per variant", + "tags": [], + "GOFLAGS": "", + "PGO": "none; no default.pgo present", + "order": [ + [ + "allocator_default", + "nosizemalloc" + ], + [ + "nosizemalloc", + "allocator_default" + ], + [ + "allocator_default", + "nosizemalloc" + ], + [ + "nosizemalloc", + "allocator_default" + ], + [ + "allocator_default", + "nosizemalloc" + ], + [ + "nosizemalloc", + "allocator_default" + ], + [ + "allocator_default", + "nosizemalloc" + ], + [ + "nosizemalloc", + "allocator_default" + ], + [ + "allocator_default", + "nosizemalloc" + ], + [ + "nosizemalloc", + "allocator_default" + ] + ], + "variants": { + "allocator_default": { + "gonum_commit": "a78cf83eff160df0e423b08af0c7642ade964150", + "sha256": "d1df446b3223c58358152233bdf15c52c6b146213f15448cbb649bd134bdc554", + "go_version": "go1.27.1", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "nosizemalloc": { + "gonum_commit": "a78cf83eff160df0e423b08af0c7642ade964150", + "sha256": "2d3e741c8a4b9a5a6c44d817d78dba1b450fb365b2fe714be26172c540afa55c", + "go_version": "go1.27.1-X:nosizespecializedmalloc", + "GOEXPERIMENT": "nosizespecializedmalloc", + "ldflags": "", + "reverted_file": null + } + }, + "benchstat": "golang.org/x/perf v0.0.0-20260312031701-16a31bc5fbd0" +} diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/nosizemalloc.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/nosizemalloc.txt new file mode 100644 index 0000000..38d91d8 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/allocator-go1.27.1/nosizemalloc.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7281 45752 ns/op 53698 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16893 21449 ns/op 22183 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9559 37802 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5658 56165 ns/op 431476 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 871 412663 ns/op 473877 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1093 330947 ns/op 400133 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1666 237510 ns/op 944728 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8645875 ns/op 2651855 B/op 483 allocs/op +BenchmarkModsep_N50-8 253 1424528 ns/op 656953 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7828 45574 ns/op 53684 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16890 21517 ns/op 22176 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9558 37803 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5948 59248 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 861 414209 ns/op 474028 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1093 330528 ns/op 400364 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1603 238042 ns/op 944758 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8664697 ns/op 2651967 B/op 483 allocs/op +BenchmarkModsep_N50-8 253 1424466 ns/op 654795 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6981 46705 ns/op 53702 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16572 21533 ns/op 22178 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9424 37972 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6354 58046 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 861 410906 ns/op 474665 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1099 330010 ns/op 400486 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1440 226551 ns/op 944805 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8613800 ns/op 2658489 B/op 483 allocs/op +BenchmarkModsep_N50-8 253 1420795 ns/op 655931 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6784 46252 ns/op 53700 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16891 21452 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9447 37965 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6074 57693 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 858 411782 ns/op 474415 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1082 330908 ns/op 400222 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1586 223285 ns/op 944812 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8673362 ns/op 2644184 B/op 482 allocs/op +BenchmarkModsep_N50-8 252 1422964 ns/op 654904 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6891 45395 ns/op 53695 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16843 21230 ns/op 22179 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9523 37913 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6361 59942 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 871 412024 ns/op 474608 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1084 331434 ns/op 401014 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1588 224939 ns/op 944793 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8649710 ns/op 2665581 B/op 483 allocs/op +BenchmarkModsep_N50-8 253 1421619 ns/op 657841 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6679 46040 ns/op 53685 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16647 21305 ns/op 22179 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9481 37753 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6210 60308 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 866 409977 ns/op 474073 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1094 332603 ns/op 399987 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1489 227800 ns/op 944770 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8668629 ns/op 2662809 B/op 484 allocs/op +BenchmarkModsep_N50-8 252 1424286 ns/op 655991 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6960 45732 ns/op 53707 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16584 21360 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9570 37996 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5685 59790 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 864 415141 ns/op 474614 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1081 330803 ns/op 400396 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1500 226457 ns/op 944806 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8632594 ns/op 2659703 B/op 483 allocs/op +BenchmarkModsep_N50-8 252 1427542 ns/op 657445 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6784 46494 ns/op 53699 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16875 21659 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9513 37886 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5692 61095 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 872 412717 ns/op 474661 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1090 330921 ns/op 401068 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1633 233095 ns/op 944770 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8709096 ns/op 2650732 B/op 482 allocs/op +BenchmarkModsep_N50-8 253 1421631 ns/op 658796 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6967 45788 ns/op 53690 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16993 21256 ns/op 22183 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9410 37779 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6511 58454 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 865 412877 ns/op 473503 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1090 330255 ns/op 400386 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1634 223678 ns/op 944783 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8681841 ns/op 2656272 B/op 482 allocs/op +BenchmarkModsep_N50-8 252 1423787 ns/op 658650 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6811 45921 ns/op 53695 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16893 21049 ns/op 22180 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9518 37866 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5084 60307 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 858 411729 ns/op 474581 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1087 331660 ns/op 399881 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1436 231813 ns/op 944775 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8680641 ns/op 2659672 B/op 483 allocs/op +BenchmarkModsep_N50-8 252 1420802 ns/op 655170 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/benchstat.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/benchstat.txt new file mode 100644 index 0000000..aeb4919 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/benchstat.txt @@ -0,0 +1,25 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro + │ old.txt │ merge.txt │ worker.txt │ calibrated.txt │ new.txt │ old_align64.txt │ new_align64.txt │ + │ sec/op │ sec/op vs base │ sec/op vs base │ sec/op vs base │ sec/op vs base │ sec/op vs base │ sec/op vs base │ +D2C_ZOH_N50-8 409.2µ ± 0% 411.9µ ± 5% +0.67% (p=0.000 n=10) 450.3µ ± 1% +10.06% (p=0.000 n=10) 450.2µ ± 1% +10.03% (p=0.000 n=10) 451.1µ ± 1% +10.25% (p=0.000 n=10) 408.2µ ± 1% ~ (p=0.796 n=10) 410.6µ ± 0% +0.36% (p=0.029 n=10) +MatLog_N50-8 327.7µ ± 1% 330.1µ ± 1% +0.75% (p=0.009 n=10) 370.1µ ± 1% +12.92% (p=0.000 n=10) 369.5µ ± 0% +12.77% (p=0.000 n=10) 369.7µ ± 1% +12.82% (p=0.000 n=10) 327.1µ ± 1% ~ (p=0.353 n=10) 329.2µ ± 0% ~ (p=0.075 n=10) +Stabsep_N100-8 8.857m ± 0% 8.846m ± 0% ~ (p=0.529 n=10) 9.398m ± 1% +6.10% (p=0.000 n=10) 9.452m ± 1% +6.72% (p=0.000 n=10) 9.421m ± 1% +6.36% (p=0.000 n=10) 8.892m ± 0% +0.39% (p=0.003 n=10) 8.874m ± 1% ~ (p=0.105 n=10) +geomean 1.059m 1.064m +0.43% 1.161m +9.66% 1.163m +9.81% 1.163m +9.78% 1.059m -0.01% 1.063m +0.33% + + │ old.txt │ merge.txt │ worker.txt │ calibrated.txt │ new.txt │ old_align64.txt │ new_align64.txt │ + │ B/op │ B/op vs base │ B/op vs base │ B/op vs base │ B/op vs base │ B/op vs base │ B/op vs base │ +D2C_ZOH_N50-8 463.2Ki ± 0% 462.8Ki ± 0% ~ (p=0.218 n=10) 463.3Ki ± 0% ~ (p=0.579 n=10) 463.5Ki ± 0% ~ (p=0.280 n=10) 463.2Ki ± 0% ~ (p=0.971 n=10) 463.0Ki ± 0% ~ (p=0.684 n=10) 463.3Ki ± 0% ~ (p=0.579 n=10) +MatLog_N50-8 391.0Ki ± 0% 390.8Ki ± 0% ~ (p=0.165 n=10) 391.0Ki ± 0% ~ (p=0.631 n=10) 390.8Ki ± 0% ~ (p=0.481 n=10) 390.7Ki ± 0% ~ (p=0.089 n=10) 390.8Ki ± 0% ~ (p=0.165 n=10) 391.1Ki ± 0% ~ (p=0.353 n=10) +Stabsep_N100-8 2.528Mi ± 0% 2.522Mi ± 1% ~ (p=0.436 n=10) 2.527Mi ± 0% ~ (p=0.739 n=10) 2.527Mi ± 0% ~ (p=0.684 n=10) 2.532Mi ± 0% ~ (p=0.796 n=10) 2.546Mi ± 1% ~ (p=0.063 n=10) 2.533Mi ± 0% ~ (p=0.247 n=10) +geomean 776.8Ki 775.9Ki -0.12% 776.9Ki +0.01% 776.8Ki -0.00% 777.1Ki +0.03% 778.4Ki +0.20% 777.6Ki +0.10% + + │ old.txt │ merge.txt │ worker.txt │ calibrated.txt │ new.txt │ old_align64.txt │ new_align64.txt │ + │ allocs/op │ allocs/op vs base │ allocs/op vs base │ allocs/op vs base │ allocs/op vs base │ allocs/op vs base │ allocs/op vs base │ +D2C_ZOH_N50-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) 53.00 ± 0% ~ (p=1.000 n=10) ¹ 53.00 ± 0% ~ (p=1.000 n=10) ¹ 53.00 ± 0% ~ (p=1.000 n=10) ¹ 53.00 ± 0% ~ (p=1.000 n=10) ¹ 53.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N50-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ 32.00 ± 0% ~ (p=1.000 n=10) 32.00 ± 0% ~ (p=1.000 n=10) ¹ 32.00 ± 0% ~ (p=1.000 n=10) ¹ 32.00 ± 0% ~ (p=1.000 n=10) ¹ 32.00 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N100-8 482.0 ± 0% 472.0 ± 0% -2.07% (p=0.000 n=10) 472.0 ± 0% -2.07% (p=0.000 n=10) 483.0 ± 0% ~ (p=0.555 n=10) 483.0 ± 0% ~ (p=0.555 n=10) 484.0 ± 0% +0.41% (p=0.008 n=10) 483.0 ± 0% ~ (p=0.086 n=10) +geomean 93.50 92.85 -0.70% 92.85 -0.70% 93.57 +0.07% 93.57 +0.07% 93.63 +0.14% 93.57 +0.07% +¹ all samples are equal diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/calibrated.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/calibrated.txt new file mode 100644 index 0000000..5156e55 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/calibrated.txt @@ -0,0 +1,80 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 531 452248 ns/op 474594 B/op 53 allocs/op +BenchmarkMatLog_N50-8 648 369391 ns/op 400157 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9384077 ns/op 2648916 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 520 450057 ns/op 474277 B/op 53 allocs/op +BenchmarkMatLog_N50-8 645 369540 ns/op 400284 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9529847 ns/op 2656115 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 530 449651 ns/op 475672 B/op 53 allocs/op +BenchmarkMatLog_N50-8 651 369307 ns/op 400323 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9531160 ns/op 2660415 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 528 448679 ns/op 474424 B/op 53 allocs/op +BenchmarkMatLog_N50-8 652 369547 ns/op 400224 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9444447 ns/op 2665723 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 519 452877 ns/op 473695 B/op 53 allocs/op +BenchmarkMatLog_N50-8 649 368730 ns/op 400067 B/op 32 allocs/op +BenchmarkStabsep_N100-8 24 9477927 ns/op 2640840 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 523 450358 ns/op 475144 B/op 53 allocs/op +BenchmarkMatLog_N50-8 646 371242 ns/op 399419 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9503315 ns/op 2660562 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 530 455478 ns/op 474682 B/op 53 allocs/op +BenchmarkMatLog_N50-8 648 368531 ns/op 400146 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9389482 ns/op 2621188 B/op 481 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 530 453729 ns/op 473265 B/op 53 allocs/op +BenchmarkMatLog_N50-8 632 370348 ns/op 400198 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9408385 ns/op 2649768 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 529 448888 ns/op 475087 B/op 53 allocs/op +BenchmarkMatLog_N50-8 646 373734 ns/op 400506 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9455393 ns/op 2648836 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 520 450008 ns/op 475320 B/op 53 allocs/op +BenchmarkMatLog_N50-8 652 369754 ns/op 400559 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9448827 ns/op 2649486 B/op 483 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/merge.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/merge.txt new file mode 100644 index 0000000..738dd64 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/merge.txt @@ -0,0 +1,80 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 582 412549 ns/op 473697 B/op 53 allocs/op +BenchmarkMatLog_N50-8 729 327841 ns/op 401089 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8822819 ns/op 2610465 B/op 469 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 580 409940 ns/op 473181 B/op 53 allocs/op +BenchmarkMatLog_N50-8 733 328897 ns/op 399576 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8826276 ns/op 2660262 B/op 473 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 572 434241 ns/op 474180 B/op 53 allocs/op +BenchmarkMatLog_N50-8 726 332270 ns/op 400072 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8813636 ns/op 2638586 B/op 472 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 580 411550 ns/op 473921 B/op 53 allocs/op +BenchmarkMatLog_N50-8 733 327926 ns/op 399553 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8849920 ns/op 2654752 B/op 473 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 577 470392 ns/op 475281 B/op 53 allocs/op +BenchmarkMatLog_N50-8 668 344636 ns/op 399683 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9108877 ns/op 2664647 B/op 473 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 572 414215 ns/op 473099 B/op 52 allocs/op +BenchmarkMatLog_N50-8 723 329857 ns/op 400311 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8835317 ns/op 2643744 B/op 472 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 576 411128 ns/op 474984 B/op 53 allocs/op +BenchmarkMatLog_N50-8 722 330884 ns/op 400208 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8859212 ns/op 2659391 B/op 473 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 583 410785 ns/op 473969 B/op 53 allocs/op +BenchmarkMatLog_N50-8 733 329406 ns/op 400249 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8884338 ns/op 2644539 B/op 472 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 583 412318 ns/op 473162 B/op 53 allocs/op +BenchmarkMatLog_N50-8 715 332010 ns/op 400460 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 8841582 ns/op 2619821 B/op 471 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 580 410352 ns/op 474606 B/op 53 allocs/op +BenchmarkMatLog_N50-8 729 330430 ns/op 399647 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8864341 ns/op 2644154 B/op 472 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/metadata.json b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/metadata.json new file mode 100644 index 0000000..cfddb11 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/metadata.json @@ -0,0 +1,165 @@ +{ + "date": "2026-09-12", + "cpu": "Apple M1 Pro", + "GOOS": "darwin", + "GOARCH": "arm64", + "GOMAXPROCS": 8, + "rounds": 10, + "benchtime": "200ms", + "controlsys_commit": "54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4", + "build_flags": "default unless noted per variant", + "tags": [], + "GOFLAGS": "", + "PGO": "none; no default.pgo present", + "order": [ + [ + "old", + "merge", + "worker", + "calibrated", + "new", + "old_align64", + "new_align64" + ], + [ + "new_align64", + "old_align64", + "new", + "calibrated", + "worker", + "merge", + "old" + ], + [ + "old", + "merge", + "worker", + "calibrated", + "new", + "old_align64", + "new_align64" + ], + [ + "new_align64", + "old_align64", + "new", + "calibrated", + "worker", + "merge", + "old" + ], + [ + "old", + "merge", + "worker", + "calibrated", + "new", + "old_align64", + "new_align64" + ], + [ + "new_align64", + "old_align64", + "new", + "calibrated", + "worker", + "merge", + "old" + ], + [ + "old", + "merge", + "worker", + "calibrated", + "new", + "old_align64", + "new_align64" + ], + [ + "new_align64", + "old_align64", + "new", + "calibrated", + "worker", + "merge", + "old" + ], + [ + "old", + "merge", + "worker", + "calibrated", + "new", + "old_align64", + "new_align64" + ], + [ + "new_align64", + "old_align64", + "new", + "calibrated", + "worker", + "merge", + "old" + ] + ], + "variants": { + "old": { + "gonum_commit": "f43007ad8a2d208bc8f47c338e85f05381d9643b", + "sha256": "dcdfa8a5caaf4e8df654563ec2fa368c7854e5551a0400eb9db26721a250d15d", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "merge": { + "gonum_commit": "7fd5fefeeb5ce24df4b58ef8a7e2b44361915ab1", + "sha256": "52010952a97766c6e539cbc4eb32e3e133130f8deeca9c050b58911364b32504", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "worker": { + "gonum_commit": "ebe982daa841625254b141121265738410ba42ee", + "sha256": "0c9269a24d16c31fcfd91549baba400a6e133318efcdd6f352f65d6754e1090f", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "calibrated": { + "gonum_commit": "777029ff0b1fabeaec83cf3786d6025403fa02e3", + "sha256": "32c48d493f18d5b0a3e19d5c80280ef231b27f2c39f1228a04fd5df9f87d6d60", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "new": { + "gonum_commit": "a78cf83eff160df0e423b08af0c7642ade964150", + "sha256": "aa1b3e74aacbf59c222b2d37a7144598d019004e80450972382a5ba85a4bfc89", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "old_align64": { + "gonum_commit": "f43007ad8a2d208bc8f47c338e85f05381d9643b", + "sha256": "8f06e5d87f675e2f44f95c15648810d239c1fd6b74d81abdf11b5da196233cef", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "-funcalign=64", + "reverted_file": null + }, + "new_align64": { + "gonum_commit": "a78cf83eff160df0e423b08af0c7642ade964150", + "sha256": "9bf0d2b338c338eb73ef6c84a499917e66041adb928396fed02f80b5877f5339", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "-funcalign=64", + "reverted_file": null + } + }, + "benchstat": "golang.org/x/perf v0.0.0-20260312031701-16a31bc5fbd0" +} diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/new.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/new.txt new file mode 100644 index 0000000..29deb6e --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/new.txt @@ -0,0 +1,80 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 529 451575 ns/op 474286 B/op 53 allocs/op +BenchmarkMatLog_N50-8 645 370947 ns/op 399544 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9401603 ns/op 2642874 B/op 481 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 531 450293 ns/op 474685 B/op 53 allocs/op +BenchmarkMatLog_N50-8 649 367997 ns/op 400344 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9400852 ns/op 2661673 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 529 450694 ns/op 474003 B/op 53 allocs/op +BenchmarkMatLog_N50-8 651 369762 ns/op 400204 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9418567 ns/op 2654876 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 526 447787 ns/op 474636 B/op 53 allocs/op +BenchmarkMatLog_N50-8 649 367650 ns/op 399981 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9423515 ns/op 2665896 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 528 451190 ns/op 474854 B/op 53 allocs/op +BenchmarkMatLog_N50-8 634 372284 ns/op 400131 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9466855 ns/op 2644470 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 519 449564 ns/op 473339 B/op 53 allocs/op +BenchmarkMatLog_N50-8 643 372350 ns/op 400078 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9517968 ns/op 2671281 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 522 453920 ns/op 474579 B/op 53 allocs/op +BenchmarkMatLog_N50-8 652 368875 ns/op 399500 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9401290 ns/op 2659488 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 517 453878 ns/op 474447 B/op 53 allocs/op +BenchmarkMatLog_N50-8 631 369622 ns/op 400275 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9402927 ns/op 2654303 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 529 452731 ns/op 473913 B/op 53 allocs/op +BenchmarkMatLog_N50-8 633 369384 ns/op 399761 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9441233 ns/op 2626395 B/op 481 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 520 451104 ns/op 474133 B/op 53 allocs/op +BenchmarkMatLog_N50-8 654 369873 ns/op 400639 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9526117 ns/op 2643896 B/op 483 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/new_align64.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/new_align64.txt new file mode 100644 index 0000000..49e6df2 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/new_align64.txt @@ -0,0 +1,80 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 579 410201 ns/op 474455 B/op 53 allocs/op +BenchmarkMatLog_N50-8 722 328276 ns/op 400385 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8851508 ns/op 2644510 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 568 407192 ns/op 473625 B/op 53 allocs/op +BenchmarkMatLog_N50-8 732 330149 ns/op 400811 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8883144 ns/op 2656252 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 579 411435 ns/op 474475 B/op 53 allocs/op +BenchmarkMatLog_N50-8 729 329377 ns/op 400676 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8852234 ns/op 2634248 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 565 409680 ns/op 473219 B/op 53 allocs/op +BenchmarkMatLog_N50-8 728 327290 ns/op 400698 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8848354 ns/op 2655740 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 578 409612 ns/op 475410 B/op 53 allocs/op +BenchmarkMatLog_N50-8 734 327932 ns/op 400353 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8956777 ns/op 2667747 B/op 485 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 582 409072 ns/op 475023 B/op 53 allocs/op +BenchmarkMatLog_N50-8 721 328957 ns/op 400924 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8949825 ns/op 2656041 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 573 412044 ns/op 474780 B/op 53 allocs/op +BenchmarkMatLog_N50-8 732 329818 ns/op 400286 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8874619 ns/op 2661765 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 559 411087 ns/op 473448 B/op 53 allocs/op +BenchmarkMatLog_N50-8 733 328303 ns/op 399383 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8913755 ns/op 2666367 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 578 412467 ns/op 474442 B/op 53 allocs/op +BenchmarkMatLog_N50-8 730 329864 ns/op 400720 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8863369 ns/op 2651393 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 559 411632 ns/op 474877 B/op 53 allocs/op +BenchmarkMatLog_N50-8 723 329627 ns/op 400148 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8873808 ns/op 2672669 B/op 485 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/old.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/old.txt new file mode 100644 index 0000000..80c5339 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/old.txt @@ -0,0 +1,80 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 585 408686 ns/op 475021 B/op 53 allocs/op +BenchmarkMatLog_N50-8 720 329527 ns/op 400408 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8834957 ns/op 2650136 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 565 406712 ns/op 474769 B/op 53 allocs/op +BenchmarkMatLog_N50-8 735 325669 ns/op 399764 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8866862 ns/op 2638249 B/op 481 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 560 407283 ns/op 474608 B/op 53 allocs/op +BenchmarkMatLog_N50-8 724 327340 ns/op 401031 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8830460 ns/op 2650477 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 579 409615 ns/op 474454 B/op 53 allocs/op +BenchmarkMatLog_N50-8 728 329553 ns/op 400374 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8895373 ns/op 2656597 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 548 409899 ns/op 474331 B/op 53 allocs/op +BenchmarkMatLog_N50-8 736 327871 ns/op 400670 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8863873 ns/op 2677367 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 582 408990 ns/op 473854 B/op 53 allocs/op +BenchmarkMatLog_N50-8 736 325819 ns/op 400358 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8838237 ns/op 2654835 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 560 409383 ns/op 473774 B/op 53 allocs/op +BenchmarkMatLog_N50-8 732 327524 ns/op 400028 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8852702 ns/op 2660749 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 580 409671 ns/op 474188 B/op 53 allocs/op +BenchmarkMatLog_N50-8 733 330869 ns/op 400097 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8861930 ns/op 2650418 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 559 410889 ns/op 474307 B/op 53 allocs/op +BenchmarkMatLog_N50-8 730 327915 ns/op 400573 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8829792 ns/op 2648997 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 582 407397 ns/op 474050 B/op 53 allocs/op +BenchmarkMatLog_N50-8 735 325686 ns/op 400116 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8892689 ns/op 2628148 B/op 481 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/old_align64.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/old_align64.txt new file mode 100644 index 0000000..232d80d --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/old_align64.txt @@ -0,0 +1,80 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 582 406879 ns/op 473645 B/op 53 allocs/op +BenchmarkMatLog_N50-8 740 325580 ns/op 399582 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8934562 ns/op 2672895 B/op 485 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 582 407135 ns/op 474947 B/op 53 allocs/op +BenchmarkMatLog_N50-8 733 326604 ns/op 400272 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8902960 ns/op 2633531 B/op 482 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 583 407377 ns/op 473906 B/op 53 allocs/op +BenchmarkMatLog_N50-8 720 329677 ns/op 400503 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8870224 ns/op 2677363 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 582 408305 ns/op 473539 B/op 53 allocs/op +BenchmarkMatLog_N50-8 726 327075 ns/op 399321 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8879750 ns/op 2656678 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 580 409358 ns/op 474747 B/op 53 allocs/op +BenchmarkMatLog_N50-8 736 327154 ns/op 399988 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8904026 ns/op 2672358 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 573 410015 ns/op 475931 B/op 53 allocs/op +BenchmarkMatLog_N50-8 724 329000 ns/op 400614 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8918136 ns/op 2666506 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 579 410513 ns/op 474288 B/op 53 allocs/op +BenchmarkMatLog_N50-8 726 327266 ns/op 399864 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8864035 ns/op 2661578 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 570 408127 ns/op 474555 B/op 53 allocs/op +BenchmarkMatLog_N50-8 734 326847 ns/op 400338 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8880388 ns/op 2645648 B/op 483 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 571 412188 ns/op 473896 B/op 53 allocs/op +BenchmarkMatLog_N50-8 730 327312 ns/op 400088 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8865995 ns/op 2672027 B/op 484 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 584 408000 ns/op 473880 B/op 53 allocs/op +BenchmarkMatLog_N50-8 734 326930 ns/op 400249 B/op 32 allocs/op +BenchmarkStabsep_N100-8 26 8967982 ns/op 2682819 B/op 484 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/worker.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/worker.txt new file mode 100644 index 0000000..52a5ff8 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/bisect-go1.26.4/worker.txt @@ -0,0 +1,80 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 530 451001 ns/op 473879 B/op 53 allocs/op +BenchmarkMatLog_N50-8 645 369711 ns/op 401175 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9373372 ns/op 2641934 B/op 471 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 530 449965 ns/op 474467 B/op 53 allocs/op +BenchmarkMatLog_N50-8 645 369667 ns/op 400843 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9393807 ns/op 2641401 B/op 471 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 523 449305 ns/op 475179 B/op 53 allocs/op +BenchmarkMatLog_N50-8 644 370081 ns/op 400434 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9401442 ns/op 2647558 B/op 472 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 529 449070 ns/op 473722 B/op 53 allocs/op +BenchmarkMatLog_N50-8 650 372566 ns/op 400017 B/op 32 allocs/op +BenchmarkStabsep_N100-8 24 9442658 ns/op 2658728 B/op 473 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 508 465109 ns/op 474459 B/op 53 allocs/op +BenchmarkMatLog_N50-8 652 374130 ns/op 400360 B/op 32 allocs/op +BenchmarkStabsep_N100-8 24 9484014 ns/op 2651919 B/op 472 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 526 450115 ns/op 475240 B/op 53 allocs/op +BenchmarkMatLog_N50-8 643 370608 ns/op 400045 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9531245 ns/op 2648629 B/op 472 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 522 450567 ns/op 474214 B/op 53 allocs/op +BenchmarkMatLog_N50-8 652 367969 ns/op 401100 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9447888 ns/op 2663619 B/op 473 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 518 453986 ns/op 473618 B/op 53 allocs/op +BenchmarkMatLog_N50-8 648 372023 ns/op 400335 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9382877 ns/op 2652757 B/op 472 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 526 449975 ns/op 474677 B/op 53 allocs/op +BenchmarkMatLog_N50-8 651 370019 ns/op 400689 B/op 32 allocs/op +BenchmarkStabsep_N100-8 25 9381602 ns/op 2619480 B/op 470 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkD2C_ZOH_N50-8 516 454875 ns/op 475109 B/op 53 allocs/op +BenchmarkMatLog_N50-8 640 368616 ns/op 399022 B/op 31 allocs/op +BenchmarkStabsep_N100-8 25 9377892 ns/op 2659968 B/op 473 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/code-comparison.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/code-comparison.txt new file mode 100644 index 0000000..0c8b303 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/code-comparison.txt @@ -0,0 +1,36 @@ +Implementation.Dtrsm old 0x100127980 mod64= 0 instructions= 888 +Implementation.Dtrsm new 0x100128410 mod64= 16 instructions= 888 +Implementation.Dtrsm no_gemv 0x100127bc0 mod64= 0 instructions= 888 +Implementation.Dtrsm no_gemm 0x1001281d0 mod64= 16 instructions= 888 +new normalized diff lines: 90 +no_gemv normalized diff lines: 0 + +no_gemm normalized diff lines: 77 +f64.Ger old 0x100120dd0 mod64= 16 instructions= 132 +f64.Ger new 0x100120e10 mod64= 16 instructions= 132 +f64.Ger no_gemv 0x100120dd0 mod64= 16 instructions= 132 +f64.Ger no_gemm 0x100120e10 mod64= 16 instructions= 132 +new normalized diff lines: 0 + +no_gemv normalized diff lines: 0 + +no_gemm normalized diff lines: 0 + +Implementation.Dgemv old 0x100124470 mod64= 48 instructions= 200 +Implementation.Dgemv new 0x100124eb0 mod64= 48 instructions= 220 +Implementation.Dgemv no_gemv 0x1001246b0 mod64= 48 instructions= 200 +Implementation.Dgemv no_gemm 0x100124c70 mod64= 48 instructions= 220 +new normalized diff lines: 304 +no_gemv normalized diff lines: 0 + +no_gemm normalized diff lines: 302 +dgemmSerialNotNot old 0x100122b60 mod64= 32 instructions= 96 +dgemmSerialNotNot new 0x100122de0 mod64= 32 instructions= 96 +dgemmSerialNotNot no_gemv 0x100122da0 mod64= 32 instructions= 96 +dgemmSerialNotNot no_gemm 0x100122ba0 mod64= 32 instructions= 96 +new normalized diff lines: 0 + +no_gemv normalized diff lines: 0 + +no_gemm normalized diff lines: 0 + diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/benchstat.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/benchstat.txt new file mode 100644 index 0000000..f45d6ca --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/benchstat.txt @@ -0,0 +1,43 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro + │ old.txt │ new.txt │ master.txt │ + │ sec/op │ sec/op vs base │ sec/op vs base │ +Reduce-8 46.47µ ± 5% 49.19µ ± 5% +5.85% (p=0.005 n=10) 49.74µ ± 5% +7.05% (p=0.004 n=10) +DiscretizeZOH-8 21.35µ ± 7% 22.58µ ± 6% +5.74% (p=0.003 n=10) 23.23µ ± 4% +8.78% (p=0.001 n=10) +Simulate_DCMotor-8 47.36µ ± 4% 40.37µ ± 2% -14.76% (p=0.000 n=10) 40.26µ ± 2% -15.00% (p=0.000 n=10) +Reg_N100_M5_P5-8 79.39µ ± 7% 59.99µ ± 6% -24.43% (p=0.000 n=10) 62.16µ ± 4% -21.70% (p=0.000 n=10) +D2C_ZOH_N50-8 413.1µ ± 4% 453.2µ ± 2% +9.69% (p=0.000 n=10) 462.2µ ± 2% +11.87% (p=0.000 n=10) +MatLog_N50-8 335.2µ ± 3% 377.7µ ± 7% +12.67% (p=0.000 n=10) 381.1µ ± 3% +13.68% (p=0.000 n=10) +SystemFRD_SISO_10000-8 237.9µ ± 7% 237.3µ ± 5% ~ (p=0.579 n=10) 236.8µ ± 2% ~ (p=0.971 n=10) +Stabsep_N100-8 9.030m ± 3% 9.626m ± 2% +6.60% (p=0.000 n=10) 9.607m ± 2% +6.39% (p=0.000 n=10) +Modsep_N50-8 1.453m ± 2% 1.535m ± 2% +5.63% (p=0.000 n=10) 1.519m ± 1% +4.56% (p=0.000 n=10) +geomean 227.2µ 227.2µ +0.01% 229.4µ +0.98% + + │ old.txt │ new.txt │ master.txt │ + │ B/op │ B/op vs base │ B/op vs base │ +Reduce-8 52.44Ki ± 0% 52.44Ki ± 0% ~ (p=0.926 n=10) 52.44Ki ± 0% ~ (p=0.341 n=10) +DiscretizeZOH-8 21.66Ki ± 0% 21.67Ki ± 0% ~ (p=0.869 n=10) 21.66Ki ± 0% ~ (p=0.515 n=10) +Simulate_DCMotor-8 19.67Ki ± 0% 16.28Ki ± 0% -17.21% (p=0.000 n=10) 16.28Ki ± 0% -17.21% (p=0.000 n=10) +Reg_N100_M5_P5-8 424.2Ki ± 0% 421.4Ki ± 0% -0.67% (p=0.000 n=10) 421.4Ki ± 0% -0.67% (p=0.000 n=10) +D2C_ZOH_N50-8 463.5Ki ± 0% 463.6Ki ± 0% ~ (p=0.631 n=10) 462.9Ki ± 0% ~ (p=0.052 n=10) +MatLog_N50-8 391.3Ki ± 0% 391.3Ki ± 0% ~ (p=0.529 n=10) 391.1Ki ± 0% ~ (p=0.393 n=10) +SystemFRD_SISO_10000-8 922.6Ki ± 0% 922.6Ki ± 0% +0.01% (p=0.011 n=10) 922.7Ki ± 0% +0.01% (p=0.008 n=10) +Stabsep_N100-8 2.534Mi ± 1% 2.530Mi ± 1% ~ (p=0.631 n=10) 2.530Mi ± 0% ~ (p=0.579 n=10) +Modsep_N50-8 641.4Ki ± 0% 640.7Ki ± 0% ~ (p=0.105 n=10) 640.5Ki ± 0% ~ (p=0.052 n=10) +geomean 240.0Ki 234.7Ki -2.18% 234.7Ki -2.20% + + │ old.txt │ new.txt │ master.txt │ + │ allocs/op │ allocs/op vs base │ allocs/op vs base │ +Reduce-8 170.0 ± 0% 170.0 ± 0% ~ (p=1.000 n=10) ¹ 170.0 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeZOH-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 45.00 ± 0% 11.00 ± 0% -75.56% (p=0.000 n=10) 11.00 ± 0% -75.56% (p=0.000 n=10) +Reg_N100_M5_P5-8 55.00 ± 0% 25.00 ± 0% -54.55% (p=0.000 n=10) 25.00 ± 0% -54.55% (p=0.000 n=10) +D2C_ZOH_N50-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) ¹ 53.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N50-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ 32.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_10000-8 60.00 ± 2% 61.00 ± 0% +1.67% (p=0.003 n=10) 61.00 ± 0% +1.67% (p=0.003 n=10) +Stabsep_N100-8 481.0 ± 0% 483.0 ± 0% +0.42% (p=0.000 n=10) 483.0 ± 0% +0.42% (p=0.000 n=10) +Modsep_N50-8 143.5 ± 0% 143.0 ± 0% -0.35% (p=0.033 n=10) 143.0 ± 0% -0.35% (p=0.033 n=10) +geomean 75.81 59.50 -21.51% 59.50 -21.51% +¹ all samples are equal diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/master.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/master.txt new file mode 100644 index 0000000..268dee8 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/master.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 5613 55017 ns/op 53700 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15310 24039 ns/op 22182 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8671 39850 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6207 61613 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 744 472440 ns/op 473713 B/op 53 allocs/op +BenchmarkMatLog_N50-8 906 383432 ns/op 399668 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1306 237662 ns/op 944796 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9734580 ns/op 2656131 B/op 483 allocs/op +BenchmarkModsep_N50-8 230 1531503 ns/op 657851 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6841 50235 ns/op 53688 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15771 23001 ns/op 22185 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8893 40845 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6237 63456 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 753 475127 ns/op 474047 B/op 53 allocs/op +BenchmarkMatLog_N50-8 903 386659 ns/op 399667 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1480 239717 ns/op 944796 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9778543 ns/op 2642167 B/op 482 allocs/op +BenchmarkModsep_N50-8 235 1540286 ns/op 654943 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6613 52385 ns/op 53699 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 14871 23453 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9105 40145 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6030 63460 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 770 461806 ns/op 473369 B/op 53 allocs/op +BenchmarkMatLog_N50-8 877 383042 ns/op 400826 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1688 231875 ns/op 944795 B/op 61 allocs/op +BenchmarkStabsep_N100-8 38 9529077 ns/op 2653670 B/op 483 allocs/op +BenchmarkModsep_N50-8 236 1545441 ns/op 654531 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6340 50757 ns/op 53710 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15414 22203 ns/op 22179 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9116 40022 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6601 59759 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 795 450160 ns/op 473827 B/op 53 allocs/op +BenchmarkMatLog_N50-8 955 369953 ns/op 400627 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1488 229595 ns/op 944799 B/op 61 allocs/op +BenchmarkStabsep_N100-8 38 9563745 ns/op 2643089 B/op 482 allocs/op +BenchmarkModsep_N50-8 235 1505492 ns/op 654967 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6826 48126 ns/op 53698 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15633 24022 ns/op 22193 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8788 40532 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5432 61572 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 794 450855 ns/op 474525 B/op 53 allocs/op +BenchmarkMatLog_N50-8 979 371555 ns/op 400400 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1410 234892 ns/op 944799 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9436697 ns/op 2664135 B/op 483 allocs/op +BenchmarkModsep_N50-8 237 1495848 ns/op 655728 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6517 47979 ns/op 53712 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15886 22317 ns/op 22173 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9081 40370 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5361 66683 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 744 462960 ns/op 474052 B/op 53 allocs/op +BenchmarkMatLog_N50-8 921 389658 ns/op 400557 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1425 232921 ns/op 944786 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9777246 ns/op 2652966 B/op 484 allocs/op +BenchmarkModsep_N50-8 232 1535642 ns/op 657476 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6636 48299 ns/op 53677 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16057 22230 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9109 39316 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6111 62700 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 752 467122 ns/op 473853 B/op 53 allocs/op +BenchmarkMatLog_N50-8 954 379282 ns/op 401056 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1563 240380 ns/op 944771 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9700900 ns/op 2648954 B/op 483 allocs/op +BenchmarkModsep_N50-8 232 1507419 ns/op 656016 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6398 48551 ns/op 53686 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16152 22809 ns/op 22195 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9141 39598 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5912 59998 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 766 455213 ns/op 474684 B/op 53 allocs/op +BenchmarkMatLog_N50-8 970 370729 ns/op 401036 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1470 237800 ns/op 944785 B/op 61 allocs/op +BenchmarkStabsep_N100-8 38 9498296 ns/op 2650154 B/op 483 allocs/op +BenchmarkModsep_N50-8 240 1499055 ns/op 656824 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6048 50344 ns/op 53689 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15098 23547 ns/op 22185 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8782 40433 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5761 57934 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 790 451597 ns/op 474750 B/op 53 allocs/op +BenchmarkMatLog_N50-8 936 382931 ns/op 400235 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1392 246812 ns/op 944755 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 9650990 ns/op 2654992 B/op 483 allocs/op +BenchmarkModsep_N50-8 236 1507956 ns/op 656392 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6364 49249 ns/op 53678 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15726 30629 ns/op 22197 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8509 41517 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5466 62774 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 772 462569 ns/op 474814 B/op 53 allocs/op +BenchmarkMatLog_N50-8 909 373681 ns/op 400473 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1444 235973 ns/op 944794 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9481182 ns/op 2655792 B/op 483 allocs/op +BenchmarkModsep_N50-8 240 1530798 ns/op 654518 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/metadata.json b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/metadata.json new file mode 100644 index 0000000..1bb93b2 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/metadata.json @@ -0,0 +1,93 @@ +{ + "date": "2026-09-12", + "cpu": "Apple M1 Pro", + "GOOS": "darwin", + "GOARCH": "arm64", + "GOMAXPROCS": 8, + "rounds": 10, + "benchtime": "300ms", + "controlsys_commit": "54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4", + "build_flags": "default unless noted per variant", + "tags": [], + "GOFLAGS": "", + "PGO": "none; no default.pgo present", + "order": [ + [ + "old", + "new", + "master" + ], + [ + "master", + "new", + "old" + ], + [ + "old", + "new", + "master" + ], + [ + "master", + "new", + "old" + ], + [ + "old", + "new", + "master" + ], + [ + "master", + "new", + "old" + ], + [ + "old", + "new", + "master" + ], + [ + "master", + "new", + "old" + ], + [ + "old", + "new", + "master" + ], + [ + "master", + "new", + "old" + ] + ], + "variants": { + "old": { + "gonum_commit": "f43007ad8a2d208bc8f47c338e85f05381d9643b", + "sha256": "5c0dcb81d615638d998758ce33796d6fc7cafa20e5c3c221695e7630fd82ae57", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "new": { + "gonum_commit": "a78cf83eff160df0e423b08af0c7642ade964150", + "sha256": "f427b78a589e5534a194b5bdd3994b6b091cb6328468a5f94f7cedc9e36f49b1", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "master": { + "gonum_commit": "1c42629c5cb53235d9ae074bb1be6da6471771da", + "sha256": "36b980704fde553dbc6a1923a461bba19a176f782b78c558b6da326bf923cab0", + "go_version": "go1.26.4", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + } + }, + "benchstat": "golang.org/x/perf v0.0.0-20260312031701-16a31bc5fbd0" +} diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/new.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/new.txt new file mode 100644 index 0000000..687c864 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/new.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6722 51207 ns/op 53710 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15058 23715 ns/op 22187 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9052 40582 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6012 60001 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 783 492546 ns/op 473623 B/op 53 allocs/op +BenchmarkMatLog_N50-8 909 405900 ns/op 399614 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1555 244982 ns/op 944766 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 9823210 ns/op 2660089 B/op 483 allocs/op +BenchmarkModsep_N50-8 230 1541796 ns/op 656865 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6398 52266 ns/op 53700 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15244 23604 ns/op 22185 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8794 40732 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5403 69656 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 763 461554 ns/op 475046 B/op 53 allocs/op +BenchmarkMatLog_N50-8 940 383299 ns/op 400251 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1401 248191 ns/op 944795 B/op 61 allocs/op +BenchmarkStabsep_N100-8 34 9867745 ns/op 2663115 B/op 484 allocs/op +BenchmarkModsep_N50-8 231 1543188 ns/op 656038 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6694 49213 ns/op 53694 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15529 22610 ns/op 22183 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9075 40700 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6109 63404 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 770 455356 ns/op 474558 B/op 53 allocs/op +BenchmarkMatLog_N50-8 960 384308 ns/op 400387 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1612 251227 ns/op 944796 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 9844321 ns/op 2655415 B/op 483 allocs/op +BenchmarkModsep_N50-8 230 1576435 ns/op 657825 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6830 48484 ns/op 53715 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16017 21983 ns/op 22172 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9170 39507 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5968 60851 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 794 451956 ns/op 474262 B/op 53 allocs/op +BenchmarkMatLog_N50-8 944 372125 ns/op 400965 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1456 234132 ns/op 944807 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9589236 ns/op 2645990 B/op 483 allocs/op +BenchmarkModsep_N50-8 236 1524790 ns/op 654604 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6740 49928 ns/op 53683 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15570 22546 ns/op 22186 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8997 40143 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6024 61083 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 800 453083 ns/op 475383 B/op 53 allocs/op +BenchmarkMatLog_N50-8 973 369440 ns/op 401054 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1472 229996 ns/op 944785 B/op 61 allocs/op +BenchmarkStabsep_N100-8 38 9494171 ns/op 2642681 B/op 482 allocs/op +BenchmarkModsep_N50-8 240 1496806 ns/op 655032 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6603 48107 ns/op 53689 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15765 22537 ns/op 22179 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8804 39476 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5844 59684 ns/op 431473 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 799 453268 ns/op 474759 B/op 53 allocs/op +BenchmarkMatLog_N50-8 975 368881 ns/op 400937 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1587 221093 ns/op 944812 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9452812 ns/op 2630089 B/op 481 allocs/op +BenchmarkModsep_N50-8 240 1545512 ns/op 656170 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6712 49162 ns/op 53712 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16168 22526 ns/op 22186 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9146 39351 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5685 59582 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 786 451124 ns/op 473727 B/op 53 allocs/op +BenchmarkMatLog_N50-8 976 370315 ns/op 400903 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1580 231243 ns/op 944784 B/op 61 allocs/op +BenchmarkStabsep_N100-8 38 9399838 ns/op 2630962 B/op 481 allocs/op +BenchmarkModsep_N50-8 238 1543244 ns/op 654530 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6705 48561 ns/op 53684 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15765 22160 ns/op 22178 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9078 40720 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6356 59976 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 792 449320 ns/op 475036 B/op 53 allocs/op +BenchmarkMatLog_N50-8 979 371505 ns/op 401417 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1551 233303 ns/op 944799 B/op 61 allocs/op +BenchmarkStabsep_N100-8 38 9453146 ns/op 2657050 B/op 483 allocs/op +BenchmarkModsep_N50-8 240 1508557 ns/op 657255 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6585 47953 ns/op 53709 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15972 23845 ns/op 22192 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8948 40180 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6447 57672 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 794 452154 ns/op 474680 B/op 53 allocs/op +BenchmarkMatLog_N50-8 969 475819 ns/op 400165 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1515 247426 ns/op 944764 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 9851101 ns/op 2660599 B/op 484 allocs/op +BenchmarkModsep_N50-8 232 1517766 ns/op 656840 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6543 51570 ns/op 53697 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15838 23996 ns/op 22186 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8925 40563 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6184 59478 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 782 457992 ns/op 475112 B/op 53 allocs/op +BenchmarkMatLog_N50-8 912 393642 ns/op 399909 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1372 240382 ns/op 944781 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 9662901 ns/op 2649449 B/op 483 allocs/op +BenchmarkModsep_N50-8 237 1527928 ns/op 655739 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/old.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/old.txt new file mode 100644 index 0000000..ef0c316 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.26.4/old.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7152 46074 ns/op 53700 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16576 21317 ns/op 22179 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7578 47995 ns/op 20137 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5509 79622 ns/op 434363 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 853 430916 ns/op 474507 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1008 337475 ns/op 400600 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1690 237461 ns/op 944701 B/op 60 allocs/op +BenchmarkStabsep_N100-8 38 9277308 ns/op 2640938 B/op 480 allocs/op +BenchmarkModsep_N50-8 241 1466449 ns/op 658506 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6624 49556 ns/op 53716 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15825 22825 ns/op 22173 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7248 49110 ns/op 20143 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4676 74607 ns/op 434358 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 830 413727 ns/op 474348 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1032 341212 ns/op 400986 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1454 249831 ns/op 944717 B/op 60 allocs/op +BenchmarkStabsep_N100-8 38 9196565 ns/op 2659384 B/op 481 allocs/op +BenchmarkModsep_N50-8 241 1468744 ns/op 655062 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6756 48875 ns/op 53688 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15778 23364 ns/op 22189 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7198 48662 ns/op 20136 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5016 84840 ns/op 434363 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 808 436256 ns/op 473976 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1030 358270 ns/op 400814 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1564 253215 ns/op 944711 B/op 60 allocs/op +BenchmarkStabsep_N100-8 39 9170046 ns/op 2652807 B/op 480 allocs/op +BenchmarkModsep_N50-8 242 1468261 ns/op 657875 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6957 46320 ns/op 53716 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16438 21442 ns/op 22189 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7562 46791 ns/op 20136 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5202 80958 ns/op 434363 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 864 413432 ns/op 475116 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1087 333186 ns/op 401250 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1490 242706 ns/op 944788 B/op 61 allocs/op +BenchmarkStabsep_N100-8 39 8938478 ns/op 2660068 B/op 481 allocs/op +BenchmarkModsep_N50-8 250 1440630 ns/op 656758 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7080 46426 ns/op 53695 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16702 21575 ns/op 22190 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7603 46493 ns/op 20135 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5083 75984 ns/op 434365 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 862 411581 ns/op 474692 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1087 329057 ns/op 400516 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1542 238346 ns/op 944837 B/op 61 allocs/op +BenchmarkStabsep_N100-8 39 8913919 ns/op 2663766 B/op 481 allocs/op +BenchmarkModsep_N50-8 250 1435598 ns/op 656869 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6535 48870 ns/op 53704 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15616 21286 ns/op 22182 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7600 49272 ns/op 20138 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5217 82298 ns/op 434364 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 854 410802 ns/op 474334 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1066 346434 ns/op 400345 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1548 220820 ns/op 944697 B/op 60 allocs/op +BenchmarkStabsep_N100-8 39 9345479 ns/op 2660546 B/op 481 allocs/op +BenchmarkModsep_N50-8 241 1479516 ns/op 658717 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6712 46704 ns/op 53689 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16720 21313 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7694 47554 ns/op 20141 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4503 85444 ns/op 434357 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 838 429386 ns/op 475574 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1057 337282 ns/op 400976 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1730 226085 ns/op 944733 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 9121596 ns/op 2664207 B/op 481 allocs/op +BenchmarkModsep_N50-8 246 1465501 ns/op 656185 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7808 46364 ns/op 53688 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16767 21273 ns/op 22183 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7657 47173 ns/op 20143 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5176 73834 ns/op 434358 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 874 409668 ns/op 475734 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1093 329226 ns/op 400354 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1476 240101 ns/op 944780 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8888289 ns/op 2643660 B/op 481 allocs/op +BenchmarkModsep_N50-8 252 1419447 ns/op 655789 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6771 46402 ns/op 53710 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16462 21283 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7624 46738 ns/op 20138 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5590 71900 ns/op 434364 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 866 408213 ns/op 475186 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1093 329798 ns/op 401301 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1702 215934 ns/op 944710 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8907433 ns/op 2617934 B/op 478 allocs/op +BenchmarkModsep_N50-8 252 1440257 ns/op 657775 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6874 46508 ns/op 53686 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16766 21386 ns/op 22179 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7777 46618 ns/op 20135 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4893 79150 ns/op 434369 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 867 412865 ns/op 474451 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1088 331092 ns/op 400138 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1526 223915 ns/op 944728 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8898181 ns/op 2654169 B/op 481 allocs/op +BenchmarkModsep_N50-8 249 1420257 ns/op 656776 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/benchstat.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/benchstat.txt new file mode 100644 index 0000000..83be9a1 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/benchstat.txt @@ -0,0 +1,43 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro + │ old.txt │ new.txt │ master.txt │ no_gemv.txt │ no_gemm.txt │ + │ sec/op │ sec/op vs base │ sec/op vs base │ sec/op vs base │ sec/op vs base │ +Reduce-8 45.19µ ± 3% 45.55µ ± 1% ~ (p=0.315 n=10) 45.38µ ± 2% ~ (p=0.739 n=10) 45.03µ ± 1% ~ (p=0.529 n=10) 45.03µ ± 1% ~ (p=0.447 n=10) +DiscretizeZOH-8 21.35µ ± 2% 21.44µ ± 8% ~ (p=0.353 n=10) 21.46µ ± 3% ~ (p=0.280 n=10) 21.31µ ± 1% ~ (p=0.912 n=10) 21.61µ ± 1% ~ (p=0.075 n=10) +Simulate_DCMotor-8 44.44µ ± 1% 38.12µ ± 1% -14.22% (p=0.000 n=10) 37.99µ ± 1% -14.51% (p=0.000 n=10) 36.42µ ± 1% -18.05% (p=0.000 n=10) 45.56µ ± 3% +2.53% (p=0.000 n=10) +Reg_N100_M5_P5-8 80.56µ ± 3% 61.20µ ± 4% -24.02% (p=0.000 n=10) 60.60µ ± 6% -24.78% (p=0.000 n=10) 59.90µ ± 2% -25.64% (p=0.000 n=10) 80.10µ ± 5% ~ (p=0.436 n=10) +D2C_ZOH_N50-8 416.1µ ± 3% 418.7µ ± 0% ~ (p=0.123 n=10) 419.1µ ± 1% ~ (p=0.075 n=10) 415.9µ ± 1% ~ (p=0.393 n=10) 422.8µ ± 1% +1.59% (p=0.019 n=10) +MatLog_N50-8 335.4µ ± 5% 340.0µ ± 4% ~ (p=0.218 n=10) 338.7µ ± 1% ~ (p=0.315 n=10) 332.7µ ± 1% ~ (p=0.052 n=10) 338.5µ ± 1% ~ (p=0.247 n=10) +SystemFRD_SISO_10000-8 228.5µ ± 8% 235.4µ ± 7% ~ (p=0.247 n=10) 235.3µ ± 3% ~ (p=0.247 n=10) 227.7µ ± 2% ~ (p=0.853 n=10) 227.8µ ± 9% ~ (p=0.912 n=10) +Stabsep_N100-8 8.672m ± 4% 8.697m ± 3% ~ (p=0.684 n=10) 8.674m ± 1% ~ (p=0.971 n=10) 8.671m ± 1% ~ (p=0.631 n=10) 8.700m ± 0% ~ (p=0.684 n=10) +Modsep_N50-8 1.442m ± 2% 1.434m ± 1% ~ (p=0.315 n=10) 1.430m ± 1% ~ (p=0.123 n=10) 1.431m ± 1% -0.77% (p=0.029 n=10) 1.436m ± 1% ~ (p=0.247 n=10) +geomean 223.2µ 214.3µ -4.01% 213.7µ -4.28% 210.7µ -5.63% 224.4µ +0.54% + + │ old.txt │ new.txt │ master.txt │ no_gemv.txt │ no_gemm.txt │ + │ B/op │ B/op vs base │ B/op vs base │ B/op vs base │ B/op vs base │ +Reduce-8 52.43Ki ± 0% 52.44Ki ± 0% ~ (p=0.137 n=10) 52.44Ki ± 0% ~ (p=0.255 n=10) 52.43Ki ± 0% ~ (p=0.470 n=10) 52.43Ki ± 0% ~ (p=0.926 n=10) +DiscretizeZOH-8 21.67Ki ± 0% 21.66Ki ± 0% ~ (p=0.515 n=10) 21.66Ki ± 0% ~ (p=0.309 n=10) 21.66Ki ± 0% -0.02% (p=0.015 n=10) 21.66Ki ± 0% ~ (p=0.156 n=10) +Simulate_DCMotor-8 19.67Ki ± 0% 16.28Ki ± 0% -17.23% (p=0.000 n=10) 16.28Ki ± 0% -17.23% (p=0.000 n=10) 16.28Ki ± 0% -17.23% (p=0.000 n=10) 19.67Ki ± 0% ~ (p=0.053 n=10) +Reg_N100_M5_P5-8 424.2Ki ± 0% 421.4Ki ± 0% -0.66% (p=0.000 n=10) 421.4Ki ± 0% -0.66% (p=0.000 n=10) 421.4Ki ± 0% -0.66% (p=0.000 n=10) 424.2Ki ± 0% +0.00% (p=0.016 n=10) +D2C_ZOH_N50-8 464.0Ki ± 0% 463.3Ki ± 0% -0.14% (p=0.009 n=10) 463.2Ki ± 0% -0.17% (p=0.001 n=10) 463.3Ki ± 0% -0.15% (p=0.015 n=10) 463.3Ki ± 0% -0.14% (p=0.023 n=10) +MatLog_N50-8 391.3Ki ± 0% 391.1Ki ± 0% ~ (p=0.436 n=10) 390.9Ki ± 0% ~ (p=0.089 n=10) 390.8Ki ± 0% -0.13% (p=0.043 n=10) 391.3Ki ± 0% ~ (p=0.481 n=10) +SystemFRD_SISO_10000-8 922.6Ki ± 0% 922.6Ki ± 0% +0.01% (p=0.000 n=10) 922.6Ki ± 0% +0.01% (p=0.000 n=10) 922.7Ki ± 0% +0.01% (p=0.000 n=10) 922.6Ki ± 0% ~ (p=0.699 n=10) +Stabsep_N100-8 2.536Mi ± 0% 2.541Mi ± 0% +0.21% (p=0.007 n=10) 2.542Mi ± 0% ~ (p=0.075 n=10) 2.536Mi ± 0% ~ (p=0.631 n=10) 2.525Mi ± 0% -0.42% (p=0.007 n=10) +Modsep_N50-8 642.7Ki ± 0% 640.7Ki ± 0% -0.31% (p=0.029 n=10) 640.6Ki ± 0% -0.33% (p=0.009 n=10) 640.8Ki ± 0% -0.29% (p=0.023 n=10) 640.0Ki ± 1% ~ (p=0.089 n=10) +geomean 240.1Ki 234.8Ki -2.18% 234.8Ki -2.19% 234.8Ki -2.21% 239.8Ki -0.11% + + │ old.txt │ new.txt │ master.txt │ no_gemv.txt │ no_gemm.txt │ + │ allocs/op │ allocs/op vs base │ allocs/op vs base │ allocs/op vs base │ allocs/op vs base │ +Reduce-8 170.0 ± 0% 170.0 ± 0% ~ (p=1.000 n=10) ¹ 170.0 ± 0% ~ (p=1.000 n=10) ¹ 170.0 ± 0% ~ (p=1.000 n=10) ¹ 170.0 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeZOH-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ 28.00 ± 0% ~ (p=1.000 n=10) ¹ 28.00 ± 0% ~ (p=1.000 n=10) ¹ 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 45.00 ± 0% 11.00 ± 0% -75.56% (p=0.000 n=10) 11.00 ± 0% -75.56% (p=0.000 n=10) 11.00 ± 0% -75.56% (p=0.000 n=10) 45.00 ± 0% ~ (p=1.000 n=10) ¹ +Reg_N100_M5_P5-8 55.00 ± 0% 25.00 ± 0% -54.55% (p=0.000 n=10) 25.00 ± 0% -54.55% (p=0.000 n=10) 25.00 ± 0% -54.55% (p=0.000 n=10) 55.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N50-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) ¹ 53.00 ± 0% ~ (p=1.000 n=10) ¹ 53.00 ± 0% ~ (p=1.000 n=10) ¹ 53.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N50-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ 32.00 ± 0% ~ (p=1.000 n=10) ¹ 32.00 ± 0% ~ (p=1.000 n=10) ¹ 32.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_10000-8 60.00 ± 2% 61.00 ± 0% +1.67% (p=0.003 n=10) 61.00 ± 0% +1.67% (p=0.003 n=10) 61.00 ± 0% +1.67% (p=0.003 n=10) 60.00 ± 2% ~ (p=1.000 n=10) +Stabsep_N100-8 480.0 ± 0% 484.0 ± 0% +0.83% (p=0.000 n=10) 483.5 ± 0% +0.73% (p=0.000 n=10) 483.0 ± 0% +0.63% (p=0.000 n=10) 480.0 ± 0% ~ (p=0.750 n=10) +Modsep_N50-8 143.5 ± 0% 143.0 ± 0% -0.35% (p=0.033 n=10) 143.0 ± 0% -0.35% (p=0.033 n=10) 143.0 ± 0% -0.35% (p=0.033 n=10) 143.0 ± 1% ~ (p=0.650 n=10) +geomean 75.80 59.52 -21.48% 59.51 -21.48% 59.50 -21.49% 75.77 -0.04% +¹ all samples are equal diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/master.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/master.txt new file mode 100644 index 0000000..1ab3b05 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/master.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7309 45542 ns/op 53707 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16872 21583 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9410 38240 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6277 58985 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 853 420781 ns/op 474502 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1030 335551 ns/op 400562 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1682 231801 ns/op 944786 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8790345 ns/op 2668535 B/op 484 allocs/op +BenchmarkModsep_N50-8 250 1431605 ns/op 657200 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7011 45568 ns/op 53700 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16827 21674 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9464 38145 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6144 60752 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 856 418945 ns/op 474591 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1077 339417 ns/op 399658 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1366 223708 ns/op 944812 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8646636 ns/op 2676131 B/op 484 allocs/op +BenchmarkModsep_N50-8 247 1428838 ns/op 655143 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6345 47707 ns/op 53676 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16730 21469 ns/op 22187 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9458 37867 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5896 63966 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 823 423875 ns/op 474018 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1064 338722 ns/op 400641 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1450 245262 ns/op 944804 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8657992 ns/op 2668999 B/op 484 allocs/op +BenchmarkModsep_N50-8 249 1432170 ns/op 655045 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7023 45527 ns/op 53712 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 17002 21309 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9561 37955 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6075 61056 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 836 418104 ns/op 474010 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1081 336515 ns/op 400245 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1377 233190 ns/op 944790 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8663438 ns/op 2667924 B/op 483 allocs/op +BenchmarkModsep_N50-8 249 1425032 ns/op 656138 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6876 45238 ns/op 53678 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16768 21459 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9244 37955 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6606 61161 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 837 417855 ns/op 474354 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1070 338763 ns/op 400396 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1461 237410 ns/op 944769 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 8642057 ns/op 2663382 B/op 483 allocs/op +BenchmarkModsep_N50-8 248 1444091 ns/op 656058 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6891 46137 ns/op 53703 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16426 22033 ns/op 22187 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9378 38213 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6446 59526 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 850 423687 ns/op 474680 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1051 338713 ns/op 400083 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1411 231254 ns/op 944793 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8731033 ns/op 2658631 B/op 483 allocs/op +BenchmarkModsep_N50-8 246 1435820 ns/op 656422 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6768 44890 ns/op 53689 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16798 21268 ns/op 22180 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9134 38019 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6361 60183 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 850 418285 ns/op 473295 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1076 336601 ns/op 400833 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1308 243311 ns/op 944749 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8693943 ns/op 2655826 B/op 484 allocs/op +BenchmarkModsep_N50-8 250 1425933 ns/op 655533 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7014 44820 ns/op 53694 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16993 21264 ns/op 22175 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9528 37923 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6055 56931 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 865 419352 ns/op 474816 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1078 342420 ns/op 400573 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1627 237651 ns/op 944773 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 8693412 ns/op 2675625 B/op 485 allocs/op +BenchmarkModsep_N50-8 249 1425502 ns/op 658025 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6963 44806 ns/op 53693 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15919 23049 ns/op 22186 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9489 39245 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6061 65085 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 811 430138 ns/op 473917 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1005 353518 ns/op 399759 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1377 241378 ns/op 944778 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8684882 ns/op 2658582 B/op 483 allocs/op +BenchmarkModsep_N50-8 240 1471807 ns/op 655830 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6878 45033 ns/op 53694 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16944 21344 ns/op 22187 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9438 37944 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5816 60440 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 853 415745 ns/op 474318 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1065 334761 ns/op 399839 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1626 228903 ns/op 944767 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8652260 ns/op 2655405 B/op 483 allocs/op +BenchmarkModsep_N50-8 250 1426927 ns/op 655358 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/metadata.json b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/metadata.json new file mode 100644 index 0000000..53614f4 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/metadata.json @@ -0,0 +1,129 @@ +{ + "date": "2026-09-12", + "cpu": "Apple M1 Pro", + "GOOS": "darwin", + "GOARCH": "arm64", + "GOMAXPROCS": 8, + "rounds": 10, + "benchtime": "300ms", + "controlsys_commit": "54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4", + "build_flags": "default unless noted per variant", + "tags": [], + "GOFLAGS": "", + "PGO": "none; no default.pgo present", + "order": [ + [ + "old", + "new", + "master", + "no_gemv", + "no_gemm" + ], + [ + "no_gemm", + "no_gemv", + "master", + "new", + "old" + ], + [ + "old", + "new", + "master", + "no_gemv", + "no_gemm" + ], + [ + "no_gemm", + "no_gemv", + "master", + "new", + "old" + ], + [ + "old", + "new", + "master", + "no_gemv", + "no_gemm" + ], + [ + "no_gemm", + "no_gemv", + "master", + "new", + "old" + ], + [ + "old", + "new", + "master", + "no_gemv", + "no_gemm" + ], + [ + "no_gemm", + "no_gemv", + "master", + "new", + "old" + ], + [ + "old", + "new", + "master", + "no_gemv", + "no_gemm" + ], + [ + "no_gemm", + "no_gemv", + "master", + "new", + "old" + ] + ], + "variants": { + "old": { + "gonum_commit": "f43007ad8a2d208bc8f47c338e85f05381d9643b", + "sha256": "1d29baebce29fcb40a8c323a345a1a8588c9730c6e4ac3a584159b8d85175a17", + "go_version": "go1.27.1", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "new": { + "gonum_commit": "a78cf83eff160df0e423b08af0c7642ade964150", + "sha256": "d1df446b3223c58358152233bdf15c52c6b146213f15448cbb649bd134bdc554", + "go_version": "go1.27.1", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "master": { + "gonum_commit": "1c42629c5cb53235d9ae074bb1be6da6471771da", + "sha256": "8e3bce0816b0d1aef6ebf2af3d32b3d9070925f1472cb754401641ba83d480c3", + "go_version": "go1.27.1", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": null + }, + "no_gemv": { + "gonum_commit": "a78cf83eff160df0e423b08af0c7642ade964150", + "sha256": "933aad663443f15287542675fe0e6b3a8b00899cb12a2e5d1c05ea31ab7f1a79", + "go_version": "go1.27.1", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": "blas/gonum/level2float64.go" + }, + "no_gemm": { + "gonum_commit": "a78cf83eff160df0e423b08af0c7642ade964150", + "sha256": "1d98d11fdb6803674d9277196855d9245256800854f0492dbedf050a0957c12e", + "go_version": "go1.27.1", + "GOEXPERIMENT": "", + "ldflags": "", + "reverted_file": "blas/gonum/dgemm.go" + } + }, + "benchstat": "golang.org/x/perf v0.0.0-20260312031701-16a31bc5fbd0" +} diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/new.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/new.txt new file mode 100644 index 0000000..9d9c4b6 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/new.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7268 46112 ns/op 53692 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16827 21433 ns/op 22180 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9513 38186 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5974 60582 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 855 419530 ns/op 474767 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1074 338617 ns/op 400589 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1424 228152 ns/op 944820 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8641154 ns/op 2665964 B/op 484 allocs/op +BenchmarkModsep_N50-8 247 1428549 ns/op 656531 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7213 45328 ns/op 53700 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16902 21715 ns/op 22192 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9324 38473 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6428 59712 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 855 416171 ns/op 474382 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1071 337408 ns/op 400931 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1658 225915 ns/op 944801 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8694699 ns/op 2676266 B/op 484 allocs/op +BenchmarkModsep_N50-8 249 1442220 ns/op 655598 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6723 49176 ns/op 53715 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15463 26483 ns/op 22189 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9463 38345 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6357 61337 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 854 420082 ns/op 475045 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1072 354204 ns/op 400293 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1443 237033 ns/op 944772 B/op 61 allocs/op +BenchmarkStabsep_N100-8 39 8649715 ns/op 2662072 B/op 485 allocs/op +BenchmarkModsep_N50-8 248 1451144 ns/op 657503 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6834 44990 ns/op 53689 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16609 21623 ns/op 22177 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9380 38824 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6626 63710 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 842 420042 ns/op 473835 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1080 347515 ns/op 400097 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1388 242441 ns/op 944758 B/op 61 allocs/op +BenchmarkStabsep_N100-8 39 8978643 ns/op 2662188 B/op 484 allocs/op +BenchmarkModsep_N50-8 250 1435223 ns/op 656851 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6944 45645 ns/op 53704 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16804 21368 ns/op 22178 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9418 38050 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6076 61113 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 853 419688 ns/op 474076 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1081 341355 ns/op 400035 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1476 436708 ns/op 944771 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8718651 ns/op 2669299 B/op 483 allocs/op +BenchmarkModsep_N50-8 247 1432903 ns/op 657496 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7016 45890 ns/op 53684 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16826 21392 ns/op 22185 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9346 37995 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6246 61296 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 840 416805 ns/op 474693 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1045 341806 ns/op 400878 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1602 227653 ns/op 944787 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8698556 ns/op 2659199 B/op 483 allocs/op +BenchmarkModsep_N50-8 249 1440589 ns/op 654905 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7035 45615 ns/op 53695 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15879 23168 ns/op 22190 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9283 38294 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6264 63379 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 812 423871 ns/op 474006 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1034 354523 ns/op 399997 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1453 251183 ns/op 944765 B/op 61 allocs/op +BenchmarkStabsep_N100-8 39 9002220 ns/op 2661240 B/op 483 allocs/op +BenchmarkModsep_N50-8 249 1453788 ns/op 655708 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6780 45478 ns/op 53692 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16686 21247 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9598 37851 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6066 57623 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 848 417690 ns/op 474959 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1075 335357 ns/op 400813 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1568 236093 ns/op 944749 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 8657416 ns/op 2672102 B/op 485 allocs/op +BenchmarkModsep_N50-8 250 1431126 ns/op 657198 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6926 45029 ns/op 53700 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16828 21187 ns/op 22183 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9487 37941 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6412 60587 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 862 416837 ns/op 474553 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1076 336440 ns/op 400445 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1518 234772 ns/op 944762 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8661970 ns/op 2667240 B/op 484 allocs/op +BenchmarkModsep_N50-8 252 1427446 ns/op 654988 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6861 44997 ns/op 53693 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16761 21449 ns/op 22179 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9480 37898 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6481 61535 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 858 417953 ns/op 474181 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1072 333689 ns/op 400467 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1602 229442 ns/op 944813 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8763085 ns/op 2663427 B/op 484 allocs/op +BenchmarkModsep_N50-8 248 1430702 ns/op 655485 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/no_gemm.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/no_gemm.txt new file mode 100644 index 0000000..1380a3b --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/no_gemm.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7418 44315 ns/op 53695 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16480 21741 ns/op 22187 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7800 45558 ns/op 20137 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5067 73109 ns/op 434360 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 824 421363 ns/op 474602 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1062 341084 ns/op 400425 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1456 243164 ns/op 944777 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8686993 ns/op 2646201 B/op 480 allocs/op +BenchmarkModsep_N50-8 248 1434770 ns/op 654825 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7995 45350 ns/op 53684 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16760 21694 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7849 47129 ns/op 20142 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5079 82097 ns/op 434362 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 838 423771 ns/op 474294 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1035 343080 ns/op 400858 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1449 221830 ns/op 944712 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8718275 ns/op 2660677 B/op 481 allocs/op +BenchmarkModsep_N50-8 249 1439085 ns/op 658006 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6976 44939 ns/op 53706 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16724 21637 ns/op 22178 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8026 45496 ns/op 20141 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4777 81499 ns/op 434362 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 840 425401 ns/op 474197 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1059 341859 ns/op 401026 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1604 217709 ns/op 944699 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8730740 ns/op 2649691 B/op 480 allocs/op +BenchmarkModsep_N50-8 246 1429268 ns/op 654860 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6753 45463 ns/op 53680 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16624 21699 ns/op 22194 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7808 45714 ns/op 20142 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5023 81146 ns/op 434360 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 847 421768 ns/op 474451 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1045 337487 ns/op 401574 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1579 247199 ns/op 944703 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8713535 ns/op 2643207 B/op 480 allocs/op +BenchmarkModsep_N50-8 249 1437869 ns/op 657272 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6958 45303 ns/op 53693 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16484 21773 ns/op 22178 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7728 45343 ns/op 20138 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5234 78389 ns/op 434363 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 843 424621 ns/op 473882 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1050 337747 ns/op 401996 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1425 232013 ns/op 944696 B/op 60 allocs/op +BenchmarkStabsep_N100-8 36 8736081 ns/op 2649726 B/op 480 allocs/op +BenchmarkModsep_N50-8 246 1446406 ns/op 663710 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6934 45608 ns/op 53698 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16340 21521 ns/op 22186 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7960 45560 ns/op 20141 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5070 76468 ns/op 434361 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 846 425665 ns/op 474231 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1050 341572 ns/op 400493 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1496 220655 ns/op 944741 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8739527 ns/op 2664026 B/op 481 allocs/op +BenchmarkModsep_N50-8 247 1447328 ns/op 659130 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7167 45072 ns/op 53700 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16551 21580 ns/op 22177 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7930 45120 ns/op 20142 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5066 76540 ns/op 434357 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 848 418961 ns/op 475490 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1065 337575 ns/op 400193 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1448 222469 ns/op 944692 B/op 60 allocs/op +BenchmarkStabsep_N100-8 39 8659669 ns/op 2644856 B/op 479 allocs/op +BenchmarkModsep_N50-8 250 1436590 ns/op 654900 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7010 44991 ns/op 53690 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16845 21546 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7030 48645 ns/op 20143 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4581 86514 ns/op 434355 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 823 442190 ns/op 474475 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1057 336587 ns/op 400548 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1648 289348 ns/op 944659 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8667556 ns/op 2649524 B/op 479 allocs/op +BenchmarkModsep_N50-8 249 1432339 ns/op 653796 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7302 44765 ns/op 53672 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16822 21276 ns/op 22178 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8070 45703 ns/op 20139 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5132 79046 ns/op 434362 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 852 420361 ns/op 474931 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1042 337180 ns/op 400586 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1510 230559 ns/op 944755 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 8677213 ns/op 2644391 B/op 481 allocs/op +BenchmarkModsep_N50-8 250 1426251 ns/op 655867 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7104 44413 ns/op 53673 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16737 21507 ns/op 22178 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8209 45211 ns/op 20139 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4957 82123 ns/op 434360 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 849 420137 ns/op 474917 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1066 339159 ns/op 400856 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1611 224983 ns/op 944689 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8675018 ns/op 2645456 B/op 479 allocs/op +BenchmarkModsep_N50-8 252 1429756 ns/op 654935 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/no_gemv.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/no_gemv.txt new file mode 100644 index 0000000..c6beb53 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/no_gemv.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7534 44977 ns/op 53726 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16644 21367 ns/op 22177 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9693 36368 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6232 60923 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 860 416425 ns/op 474686 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1084 332322 ns/op 400459 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1311 231863 ns/op 944832 B/op 61 allocs/op +BenchmarkStabsep_N100-8 39 8676347 ns/op 2657041 B/op 483 allocs/op +BenchmarkModsep_N50-8 250 1432593 ns/op 656542 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7072 44730 ns/op 53682 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16812 21353 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9818 36522 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6051 59869 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 862 416748 ns/op 474163 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1050 337299 ns/op 400252 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1476 224781 ns/op 944799 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8674741 ns/op 2665713 B/op 483 allocs/op +BenchmarkModsep_N50-8 252 1424781 ns/op 656224 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7098 44527 ns/op 53696 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16843 21155 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9946 36467 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6406 59934 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 856 416347 ns/op 473705 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1087 329929 ns/op 399792 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1418 226638 ns/op 944763 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8667292 ns/op 2666357 B/op 483 allocs/op +BenchmarkModsep_N50-8 253 1433804 ns/op 656179 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6918 44819 ns/op 53702 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16779 21277 ns/op 22178 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9709 36335 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6352 60339 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 871 412931 ns/op 474532 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1070 334471 ns/op 401036 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1459 228876 ns/op 944803 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8653604 ns/op 2666508 B/op 484 allocs/op +BenchmarkModsep_N50-8 252 1428457 ns/op 654224 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7044 45529 ns/op 53676 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16581 21303 ns/op 22180 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9897 36459 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6392 60606 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 856 417685 ns/op 474334 B/op 53 allocs/op +BenchmarkMatLog_N50-8 986 333349 ns/op 399816 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1640 231764 ns/op 944787 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 8726516 ns/op 2657116 B/op 484 allocs/op +BenchmarkModsep_N50-8 250 1437483 ns/op 655075 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7299 45536 ns/op 53688 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16782 21609 ns/op 22179 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 10000 36618 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5762 58232 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 868 414758 ns/op 475218 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1086 330741 ns/op 400145 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1400 232375 ns/op 944760 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8705140 ns/op 2654584 B/op 483 allocs/op +BenchmarkModsep_N50-8 244 1441776 ns/op 654815 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6890 45852 ns/op 53693 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16926 21191 ns/op 22175 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9859 36775 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6237 60085 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 868 424214 ns/op 474914 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1075 333072 ns/op 399851 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1713 227892 ns/op 944792 B/op 61 allocs/op +BenchmarkStabsep_N100-8 39 8652985 ns/op 2664544 B/op 484 allocs/op +BenchmarkModsep_N50-8 252 1421365 ns/op 658287 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6972 44727 ns/op 53683 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16911 21300 ns/op 22187 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9925 36213 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 6039 58691 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 848 413840 ns/op 475066 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1098 333651 ns/op 400397 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1671 225973 ns/op 944802 B/op 61 allocs/op +BenchmarkStabsep_N100-8 42 8609196 ns/op 2656047 B/op 483 allocs/op +BenchmarkModsep_N50-8 252 1437774 ns/op 655672 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6912 45265 ns/op 53681 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16754 21309 ns/op 22182 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9861 36376 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5972 59721 ns/op 431474 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 864 415395 ns/op 473680 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1084 330852 ns/op 399997 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1536 224268 ns/op 944806 B/op 61 allocs/op +BenchmarkStabsep_N100-8 36 8612594 ns/op 2656197 B/op 483 allocs/op +BenchmarkModsep_N50-8 252 1418586 ns/op 658498 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7087 45074 ns/op 53711 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16388 21530 ns/op 22174 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 9829 36260 ns/op 16672 B/op 11 allocs/op +BenchmarkReg_N100_M5_P5-8 5811 59650 ns/op 431475 B/op 25 allocs/op +BenchmarkD2C_ZOH_N50-8 867 413589 ns/op 473863 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1098 329612 ns/op 400660 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1566 227472 ns/op 944797 B/op 61 allocs/op +BenchmarkStabsep_N100-8 39 8699827 ns/op 2661922 B/op 484 allocs/op +BenchmarkModsep_N50-8 250 1427942 ns/op 656262 B/op 143 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/old.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/old.txt new file mode 100644 index 0000000..5b7e61a --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/go1.27.1/old.txt @@ -0,0 +1,140 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7370 45072 ns/op 53699 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16512 21545 ns/op 22189 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8073 44500 ns/op 20145 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4845 80307 ns/op 434357 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 847 417577 ns/op 474093 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1054 333534 ns/op 400471 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1562 228010 ns/op 944747 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8677273 ns/op 2660710 B/op 481 allocs/op +BenchmarkModsep_N50-8 250 1440008 ns/op 660652 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7003 46642 ns/op 53678 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16000 21146 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8028 44253 ns/op 20141 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5020 77127 ns/op 434359 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 805 432105 ns/op 476075 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1026 358740 ns/op 400720 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1332 241839 ns/op 944663 B/op 60 allocs/op +BenchmarkStabsep_N100-8 39 8849487 ns/op 2659878 B/op 480 allocs/op +BenchmarkModsep_N50-8 243 1467306 ns/op 659616 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7054 45602 ns/op 53704 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 15892 22164 ns/op 22181 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8234 44491 ns/op 20146 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5054 80322 ns/op 434355 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 841 416569 ns/op 475198 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1070 345669 ns/op 400895 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1532 228918 ns/op 944667 B/op 60 allocs/op +BenchmarkStabsep_N100-8 42 9026585 ns/op 2650745 B/op 479 allocs/op +BenchmarkModsep_N50-8 236 1498316 ns/op 663134 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6951 44860 ns/op 53669 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 17073 21290 ns/op 22185 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8211 44270 ns/op 20143 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4994 82415 ns/op 434357 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 854 414789 ns/op 474893 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1078 334048 ns/op 400233 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1653 221860 ns/op 944707 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8611730 ns/op 2654207 B/op 481 allocs/op +BenchmarkModsep_N50-8 249 1426630 ns/op 656191 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6790 46607 ns/op 53675 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16622 21227 ns/op 22177 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8095 44382 ns/op 20143 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5180 78968 ns/op 434359 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 854 415199 ns/op 474716 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1070 332131 ns/op 400223 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1623 217636 ns/op 944721 B/op 60 allocs/op +BenchmarkStabsep_N100-8 42 8667503 ns/op 2657664 B/op 480 allocs/op +BenchmarkModsep_N50-8 252 1451352 ns/op 656392 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7093 45308 ns/op 53702 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16350 21782 ns/op 22184 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 7960 45078 ns/op 20141 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5076 82701 ns/op 434358 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 859 426839 ns/op 474690 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1024 353170 ns/op 400810 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1654 226426 ns/op 944684 B/op 60 allocs/op +BenchmarkStabsep_N100-8 39 10651975 ns/op 2659614 B/op 480 allocs/op +BenchmarkModsep_N50-8 240 1466495 ns/op 655611 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6880 45818 ns/op 53684 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16275 21492 ns/op 22186 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8260 44688 ns/op 20140 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5016 80332 ns/op 434357 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 829 419102 ns/op 475708 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1039 336806 ns/op 400680 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1455 259798 ns/op 944754 B/op 61 allocs/op +BenchmarkStabsep_N100-8 40 8737880 ns/op 2666754 B/op 481 allocs/op +BenchmarkModsep_N50-8 248 1443366 ns/op 657562 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7125 44586 ns/op 53686 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16917 21254 ns/op 22185 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8149 44183 ns/op 20142 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4638 81545 ns/op 434361 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 835 415696 ns/op 476106 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1076 337568 ns/op 400830 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1510 230601 ns/op 944769 B/op 61 allocs/op +BenchmarkStabsep_N100-8 37 8641472 ns/op 2666053 B/op 480 allocs/op +BenchmarkModsep_N50-8 250 1434077 ns/op 658710 B/op 144 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 6998 44759 ns/op 53681 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 17164 21091 ns/op 22189 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8217 45136 ns/op 20141 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 5054 80783 ns/op 434357 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 860 411920 ns/op 475953 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1066 331405 ns/op 400002 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1564 245750 ns/op 944692 B/op 60 allocs/op +BenchmarkStabsep_N100-8 40 8627373 ns/op 2653169 B/op 480 allocs/op +BenchmarkModsep_N50-8 252 1425013 ns/op 656416 B/op 143 allocs/op +PASS +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkReduce-8 7074 44596 ns/op 53699 B/op 170 allocs/op +BenchmarkDiscretizeZOH-8 16837 21410 ns/op 22188 B/op 28 allocs/op +BenchmarkSimulate_DCMotor-8 8068 44044 ns/op 20145 B/op 45 allocs/op +BenchmarkReg_N100_M5_P5-8 4837 83031 ns/op 434356 B/op 55 allocs/op +BenchmarkD2C_ZOH_N50-8 854 415582 ns/op 475104 B/op 53 allocs/op +BenchmarkMatLog_N50-8 1087 332026 ns/op 401812 B/op 32 allocs/op +BenchmarkSystemFRD_SISO_10000-8 1714 213097 ns/op 944688 B/op 60 allocs/op +BenchmarkStabsep_N100-8 37 8601935 ns/op 2658460 B/op 480 allocs/op +BenchmarkModsep_N50-8 250 1436343 ns/op 658958 B/op 144 allocs/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/matlog-trace.txt b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/matlog-trace.txt new file mode 100644 index 0000000..b5b79df --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/matlog-trace.txt @@ -0,0 +1,14 @@ +TRACE Dgemm NN 51x51x51 gonum.org/v1/gonum/blas/blas64.Gemm +TRACE Dtrsm LLNU 51x51 lda=51 ldb=51 gonum.org/v1/gonum/lapack/gonum.Implementation.Dgetrs +TRACE Dtrsm LUNN 51x51 lda=51 ldb=51 gonum.org/v1/gonum/lapack/gonum.Implementation.Dgetrs +TRACE Dgemm NN 50x50x50 gonum.org/v1/gonum/lapack/gonum.Implementation.Dtrevc3 +TRACE Dtrsm LLNU 64x36 lda=100 ldb=100 gonum.org/v1/gonum/lapack/gonum.Implementation.Dgetrf +TRACE Dgemm NN 36x36x64 gonum.org/v1/gonum/lapack/gonum.Implementation.Dgetrf +TRACE Dtrsm LLNU 100x50 lda=100 ldb=50 gonum.org/v1/gonum/lapack/gonum.Implementation.Dgetrs +TRACE Dtrsm LUNN 100x50 lda=100 ldb=50 gonum.org/v1/gonum/lapack/gonum.Implementation.Dgetrs +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro +BenchmarkMatLog_N50-8 1 1277834 ns/op +PASS diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/profiles/new.pprof b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/profiles/new.pprof new file mode 100644 index 0000000000000000000000000000000000000000..3870188ec53b0af6fdb559a1345e7ea059399727 GIT binary patch literal 10175 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 W%TjhS_5T9^0RR6;kg%)+SpWbawLHZD literal 0 HcmV?d00001 diff --git a/docs/benchmarks/gonum-v0.19.0/issue10-investigation/run.py b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/run.py new file mode 100644 index 0000000..1a5c974 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/issue10-investigation/run.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +"""Build immutable controlsys/Gonum snapshots and compare prebuilt binaries.""" +import argparse +import hashlib +import io +import json +import os +from pathlib import Path +import re +import shutil +import subprocess +import tarfile + +CONTROL = "54d5d6b119c8b4351db0cd0bc0ebb4122bde94d4" +OLD = "f43007ad8a2d208bc8f47c338e85f05381d9643b" +NEW = "a78cf83eff160df0e423b08af0c7642ade964150" +MASTER = "1c42629c5cb53235d9ae074bb1be6da6471771da" +CASES = "MatLog_N50|D2C_ZOH_N50|Stabsep_N100|SystemFRD_SISO_10000|Reduce|Modsep_N50|DiscretizeZOH|Simulate_DCMotor|Reg_N100_M5_P5" + + +def capture(args, **kwargs): + return subprocess.check_output(args, text=True, **kwargs).strip() + + +def archive(repo, revision, destination): + destination.mkdir(parents=True) + data = subprocess.check_output(["git", "-C", str(repo), "archive", revision]) + with tarfile.open(fileobj=io.BytesIO(data)) as source: + source.extractall(destination, filter="data") + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--gonum", type=Path, default=Path(__file__).resolve().parents[4]) + parser.add_argument("--controlsys", type=Path, required=True) + parser.add_argument("--go", default="go") + parser.add_argument("--output", type=Path, required=True) + parser.add_argument("--suite", choices=["releases", "allocator", "bisect"], default="releases") + parser.add_argument("--rounds", type=int, default=10) + parser.add_argument("--benchtime", default="300ms") + args = parser.parse_args() + if args.rounds < 1: + parser.error("rounds must be positive") + go = shutil.which(args.go) + if not go: + parser.error("Go executable not found") + output = args.output.resolve() + output.mkdir(parents=True, exist_ok=False) + variants = [("old", OLD), ("new", NEW), ("master", MASTER), + ("no_gemv", NEW), ("no_gemm", NEW)] + cases = CASES + if args.suite == "allocator": + variants = [("allocator_default", NEW), ("nosizemalloc", NEW)] + elif args.suite == "bisect": + variants = [("old", OLD), ("merge", "7fd5fefe"), ("worker", "ebe982da"), + ("calibrated", "777029ff"), ("new", NEW), + ("old_align64", OLD), ("new_align64", NEW)] + cases = "MatLog_N50|D2C_ZOH_N50|Stabsep_N100" + metadata = { + "controlsys": CONTROL, "go": capture([go, "version"]), + "go_env": json.loads(capture([go, "env", "-json", "GOOS", "GOARCH", "GOFLAGS", "GOEXPERIMENT", "GOTOOLCHAIN"])), + "runtime_env": {k: os.environ.get(k, "") for k in ["GODEBUG", "GOMEMLIMIT", "GOGC"]}, + "GOMAXPROCS": 8, "rounds": args.rounds, "benchtime": args.benchtime, + "bench": "^Benchmark(" + cases + ")$", "variants": {}, "order": [], + } + for label, revision in variants: + revision = capture(["git", "-C", str(args.gonum), "rev-parse", revision + "^{commit}"]) + directory = output / label + gonum, control = directory / "gonum", directory / "controlsys" + archive(args.gonum, revision, gonum) + archive(args.controlsys, CONTROL, control) + reverted = {"no_gemv": "blas/gonum/level2float64.go", "no_gemm": "blas/gonum/dgemm.go"}.get(label) + if reverted: + (gonum / reverted).write_bytes(subprocess.check_output( + ["git", "-C", str(args.gonum), "show", OLD + ":" + reverted])) + env = dict(os.environ) + if label == "nosizemalloc": + if env.get("GOEXPERIMENT"): + raise RuntimeError("allocator comparison requires an unset GOEXPERIMENT") + env["GOEXPERIMENT"] = "nosizespecializedmalloc" + subprocess.run([go, "mod", "edit", "-replace=gonum.org/v1/gonum=" + str(gonum)], cwd=control, check=True) + binary = directory / "controlsys.test" + command = [go, "test", "-c", "-o", str(binary)] + if label.endswith("_align64"): + command.append("-ldflags=-funcalign=64") + subprocess.run(command, cwd=control, env=env, check=True) + metadata["variants"][label] = { + "gonum": revision, "reverted_file": reverted, "build": command, + "GOEXPERIMENT": env.get("GOEXPERIMENT", ""), + "sha256": hashlib.sha256(binary.read_bytes()).hexdigest(), + "binary_version": capture([go, "version", "-m", str(binary)]), + } + print("built", label, flush=True) + expected = None + labels = [label for label, _ in variants] + for round_index in range(args.rounds): + order = labels if round_index % 2 == 0 else labels[::-1] + metadata["order"].append(order) + for label in order: + command = [str(output / label / "controlsys.test"), "-test.run=^$", + "-test.bench=" + metadata["bench"], "-test.benchmem", + "-test.benchtime=" + args.benchtime, "-test.count=1"] + result = subprocess.run(command, cwd=output, env={**os.environ, "GOMAXPROCS": "8"}, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) + with (output / (label + ".txt")).open("a") as stream: + stream.write(result.stdout) + result.check_returncode() + names = re.findall(r"^(Benchmark\S+)\s+\d+\s+", result.stdout, re.MULTILINE) + if not names or (expected is not None and names != expected): + raise RuntimeError("empty or mismatched benchmark selection: " + label) + expected = names + (output / "metadata.json").write_text(json.dumps(metadata, indent=2) + "\n") + print("round", round_index + 1, flush=True) + + +if __name__ == "__main__": + main() diff --git a/go.mod b/go.mod index feef149..41577da 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/jamestjsp/controlsys -go 1.26.3 +go 1.27.1 require gonum.org/v1/gonum v0.15.0 diff --git a/model_array.go b/model_array.go index e4d010b..dcba781 100644 --- a/model_array.go +++ b/model_array.go @@ -1,6 +1,9 @@ package controlsys -import "fmt" +import ( + "fmt" + "slices" +) type ModelArray struct { models []*System @@ -284,13 +287,13 @@ func (a *ModelArray) flatIndex(index []int) (int, error) { } flat := 0 stride := 1 - for dim := len(a.shape) - 1; dim >= 0; dim-- { + for dim, v := range slices.Backward(a.shape) { idx := index[dim] - if idx < 0 || idx >= a.shape[dim] { + if idx < 0 || idx >= v { return 0, fmt.Errorf("ModelArray.Model: index %d out of range for dimension %d: %w", idx, dim, ErrDimensionMismatch) } flat += idx * stride - stride *= a.shape[dim] + stride *= v } return flat, nil } From e290fe4dd1ded27199041a99270b40325bea2922 Mon Sep 17 00:00:00 2001 From: James Joseph Date: Sat, 12 Sep 2026 18:47:48 -0500 Subject: [PATCH 4/4] docs: retain full Go 1.27 Gonum performance comparison --- docs/benchmarks/gonum-v0.19.0/README.md | 4 + .../gonum-v0.19.0/go1.27.1-full/README.md | 123 +++ .../go1.27.1-full/focused-baseline.txt.gz | Bin 0 -> 1575 bytes .../go1.27.1-full/focused-benchstat.txt | 50 ++ .../go1.27.1-full/focused-candidate.txt.gz | Bin 0 -> 1532 bytes .../go1.27.1-full/full-baseline.txt.gz | Bin 0 -> 29758 bytes .../go1.27.1-full/full-benchstat.txt | 727 ++++++++++++++++++ .../go1.27.1-full/full-candidate.txt.gz | Bin 0 -> 29433 bytes .../gonum-v0.19.0/go1.27.1-full/metadata.json | 132 ++++ 9 files changed, 1036 insertions(+) create mode 100644 docs/benchmarks/gonum-v0.19.0/go1.27.1-full/README.md create mode 100644 docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-baseline.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-candidate.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/go1.27.1-full/full-baseline.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/go1.27.1-full/full-benchstat.txt create mode 100644 docs/benchmarks/gonum-v0.19.0/go1.27.1-full/full-candidate.txt.gz create mode 100644 docs/benchmarks/gonum-v0.19.0/go1.27.1-full/metadata.json diff --git a/docs/benchmarks/gonum-v0.19.0/README.md b/docs/benchmarks/gonum-v0.19.0/README.md index dbab2dc..ced085f 100644 --- a/docs/benchmarks/gonum-v0.19.0/README.md +++ b/docs/benchmarks/gonum-v0.19.0/README.md @@ -1,5 +1,9 @@ # Gonum v0.19.0-fork upgrade: performance evidence +For the updated PR requiring Go 1.27.1, see the [full follow-up](go1.27.1-full/README.md). +It substantially reduces the large regressions below, but confirms residual +slowdowns up to 6.17%. This original Go 1.26.4 report remains historical evidence. + Measured on 2026-09-12 for PR #171. The upgrade has mixed performance on this machine. The complete 236-case timing geomean improves 0.75%, but reproducible slowdowns remain. This is not a regression-free performance approval. Assess the diff --git a/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/README.md b/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/README.md new file mode 100644 index 0000000..3817856 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/README.md @@ -0,0 +1,123 @@ +# Full Go 1.27.1 follow-up + +Measured on 2026-09-12 for controlsys PR #171. The Go 1.27.1 configuration +substantially reduces the large Go 1.26.4 regressions and retains simulation and +regulator improvements. Residual slowdowns remain: this is a mixed-performance +upgrade, with a release decision still needed before merge/publication. + +## Controlled comparison + +Apple M1 Pro, darwin/arm64, Go 1.27.1, GOMAXPROCS=8, default Gonum Go BLAS/LAPACK, +no custom build tags, GOFLAGS, PGO, alignment flags, or GOEXPERIMENT overrides. +A normal desktop host was used without affinity or power-state control. + +- Candidate source: controlsys `2027e5d`, Gonum `v0.19.0-fork`. +- Baseline source: controlsys `fdda4f150d13b34a969de7faed6ae896e827ce94`, Gonum + `v0.17.7-fork`, with the same Go 1.27.1 directive and candidate `model_array.go`. +- Go 1.27's required `go fix` changed the reverse index loop to `slices.Backward`. + That rewrite was applied identically to both variants. All 191 Go files were + verified byte-identical between variants; candidate source matched the PR. +- Both binaries were built before timing. No local builds, tests, or profiling + ran concurrently with acceptance measurements. +- Full suite: 236 cases, ten samples per version, 100ms per case. Follow-up: + eleven cases, ten samples per version, 300ms per case. Revision order alternated + baseline/candidate and candidate/baseline. All runs passed with matching cases. +- benchstat: `golang.org/x/perf v0.0.0-20260312031701-16a31bc5fbd0`. + +This isolates the dependency under the final Go 1.27 configuration; it does not +isolate a compiler-only change against the earlier Go 1.26 run. The separate +[issue investigation](../issue10-investigation/README.md) examines that question. + +## Results + +The complete timing geomean improves **1.07%**. A geomean is not application +throughput and does not imply that every workload improves. The longer follow-up +covered all full-suite slowdowns of at least 3%, the seven original issue cases, +and representative gains. Follow-up medians: + +| Benchmark | v0.17.7-fork | v0.19.0-fork | Time change | p | +| --- | ---: | ---: | ---: | ---: | +| SimulateWithDelay_SISO | 18.31 us | 18.93 us | +3.38% | <0.001 | +| SimulateInternalDelay | 20.52 us | 21.42 us | +4.38% | <0.001 | +| SystemFRD_SISO_10000 | 217.6 us | 231.0 us | +6.17% | <0.001 | +| MatLog_N50 | 331.9 us | 335.6 us | +1.09% | <0.001 | +| D2C_ZOH_N50 | 413.7 us | 417.9 us | +1.02% | 0.001 | +| Stabsep_N100 | 8.612 ms | 8.658 ms | +0.54% | 0.015 | +| Reduce | 45.33 us | 45.81 us | +1.07% | 0.009 | +| DiscretizeZOH | 21.23 us | 21.36 us | inconclusive | 0.305 | +| Modsep_N50 | 1.433 ms | 1.428 ms | -0.36% | 0.011 | +| Simulate_DCMotor | 43.88 us | 38.05 us | -13.29% | <0.001 | +| Reg_N100_M5_P5 | 79.78 us | 59.68 us | -25.20% | <0.001 | + +The earlier 12.62%, 9.92%, and 6.18% regressions in MatLog, D2C, and Stabsep +are greatly reduced, but small significant differences remain in this final +configuration. The original focused investigation's absence of significance +should not be read as proof of equivalence. Different source/build layouts and +measurement sessions can change these small effects; no specific cause of the +remaining slowdowns has been established here. + +Delay benchmarks have unchanged allocation counts. The SISO FRD case rises from +60 to 61 allocs/op, Stabsep_N100 from 480 to 484. DC motor simulation drops from +45 to 11 and regulator construction from 55 to 25. Full memory results and +confidence intervals are retained in the tables. The full sweep includes smaller +changes outside the selected follow-up; multiple comparisons can yield false +positives, particularly for small effects. Other CPUs and worker counts remain +unmeasured. + +## Validation and release implications + +Go 1.27.1 passes `go fix ./...`, `go vet ./...`, `go build ./...`, full uncached +tests, race tests, the local downstream-consumer action, and GitHub push/PR CI. +The current CLI `govulncheck` v1.8.0 reports no vulnerabilities. The bundled gopls +v0.22.0 scanner could not load the newer Go version; the CLI replaced that check. + +The PR now requires Go 1.27.1 in go.mod and CI. This raises the minimum Go version +from 1.26.3 and must be disclosed in release notes. The Gonum pin remains the +released `v0.19.0-fork`, not master. The prepared release remains a draft: assess +or repair the residual 3–6% regressions before publication. This configuration +improves the performance assessment but does not close Gonum issue #10 or repair +the older-toolchain executable-layout behavior. + +## Evidence and reproduction + +`full-benchstat.txt` and `focused-benchstat.txt` retain complete tables. Matching +`*-baseline.txt.gz` and `*-candidate.txt.gz` contain the raw samples. +`metadata.json` records full-sweep hashes, flags, order, and source adjustments. + +Run this Bash recipe from controlsys with Go 1.27.1 to reproduce the controlled +source comparison. Both variants use the final candidate source; only the Gonum +replacement differs. Compile before timing and keep other CPU-heavy work idle. + +```bash +set -eu +bench_dir=$(mktemp -d) +for label in baseline candidate; do + mkdir "$bench_dir/$label" + git archive 2027e5d | tar -x -C "$bench_dir/$label" +done +(cd "$bench_dir/baseline" && go mod edit \ + -replace=gonum.org/v1/gonum=github.com/jamestjsp/gonum@v0.17.7-fork && go mod tidy) +for label in baseline candidate; do + (cd "$bench_dir/$label" && go test -c -o "$bench_dir/$label.test") +done +export GOMAXPROCS=8 +for round in $(seq 1 10); do + order='baseline candidate' + if [ $((round % 2)) -eq 0 ]; then order='candidate baseline'; fi + for label in $order; do + "$bench_dir/$label.test" -test.run='^$' -test.bench=. \ + -test.benchmem -test.benchtime=100ms -test.count=1 \ + >> "$bench_dir/$label.txt" + done +done +benchstat "$bench_dir/baseline.txt" "$bench_dir/candidate.txt" +``` + +For the focused follow-up, use 300ms and: + +```text +^Benchmark(SimulateWithDelay_SISO|SimulateInternalDelay|SystemFRD_SISO_10000|MatLog_N50|D2C_ZOH_N50|Stabsep_N100|Reduce|Modsep_N50|DiscretizeZOH|Simulate_DCMotor|Reg_N100_M5_P5)$ +``` + +For reanalysis without rerunning, decompress each retained pair using `gzip -dc` +and pass the resulting files to the recorded benchstat version. diff --git a/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-baseline.txt.gz b/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-baseline.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..bf5c822eeec9410396322f43038dcf5ae19eafe8 GIT binary patch literal 1575 zcmV+?2H5!@iwFP!00002|IM1+Zrer>g|F+U;0v^wnVtO^-z71M2B?!Dz9`TeL6HT= ziEIgyj3Ryd4k<3VD=4|Jho}MspbTlW8j|0hbB1^8_3pB{op1lSf4sO`&$o*&m(6_p z5cp#A?e4OHdJ8Qu8LiYTw$-SF81+eZyG))AIIdvFz#{|LZ;%eQ<{Y%(1NRT}ZL0j}cDQzq;Qo zw#)tfzstWr{84{RxBeguhXRE9VysVuiOcotuQ^da_vhW?ez|>|ueu%`zNf1ned^aw zz=4bY=rB4h3Q;`@@c%uh#ER*1w{+GwuBBy@%tIeE3`n)EzK7(Go-b$X-`m)_14sU(fe{ zuJ2BjKh#G^p*wI6Ik>StfW)dlj!yRf`)7$%H$Sxg(*d4+!WDxDzq< zr!%?YzHPbV#ezGotDnRt=8`)Cm@4kz^SHy(bH{_Hf;-70pD}klapq2p&YnA}Li)yr zBv^7skzt^B;;45h*4&BFLhle}?s&ur^iHoAns&oF(mVKa?yw5B9uP#1YVL>$cS6=X z9ty5S-O!?~-f_jg^$s2M4uEGGxx>k&WT|(YW5$9z zK{tYmJMOHw!xS=i97TKXsH*83t9Nj!xkDCuC*bI_sMb4R!5vNmciaTr0nR>Djc2I2 z;|;izpzlvYA7KKY)pJd`12L7{Ny)@##hAIHPO;=pB((5Zn7QMf)Osh9A$Pp!K3H(a z#Z+;hqr8ke6v3xb?|?gNy~C2ZgF@!q(fexfS&>tn?}%-_LsaKGQ7pLA?}sgC;uQG~ z$q%_>p?3ns9uUwr+}>ve$UX}TJ=k)m&ZnNOcLweVRryXxCVD3x^d?aXq2i97`ieXF zGVVm-(T7qXufE!ZJJ9PL-4{c_ok;Gi^^U|LR~DJTXJxLjXO=qOaTeU^_e13lm$`MT zcY+0Xaz4`ftS~{olYNl-tmN%;WkAY$M?6lUce2m&o=TskHv*XG9q743A(r_LsDQTM zPR}($-2rOuR9twm&(du$VUh1d6;viZ3v#a93jBgQUi=yBoq#wccS4Yy?vs3_`Gk2UD@||SwvsBv; z++kO92Tb%%p3|$Z0d5%s;^DG*5=mF?|7Sh2eZ#oD^%$niWb}%@||{IR&fWT>GL~n$$~rNs=3Ou_0D1Lp_`N{ ze=51->v{2+afj2OcW46cjCw@%PH|nf`A!T5+(|OzJK&FeRlyV1f zf_%rt?6azT#6I64S3cJl_2)!Wz2n4l$(;njB;WCUz5`r5A0&sz%`E3xlFEE1=#Fgq Z+@M3G!e<2s5`NB|{{RWO)Q_($003KpUmO4c literal 0 HcmV?d00001 diff --git a/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-benchstat.txt b/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-benchstat.txt new file mode 100644 index 0000000..3ec60e7 --- /dev/null +++ b/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-benchstat.txt @@ -0,0 +1,50 @@ +goos: darwin +goarch: arm64 +pkg: github.com/jamestjsp/controlsys +cpu: Apple M1 Pro + │ baseline.txt │ candidate.txt │ + │ sec/op │ sec/op vs base │ +SimulateWithDelay_SISO-8 18.31µ ± 1% 18.93µ ± 1% +3.38% (p=0.000 n=10) +Reduce-8 45.33µ ± 1% 45.81µ ± 1% +1.07% (p=0.009 n=10) +DiscretizeZOH-8 21.23µ ± 1% 21.36µ ± 1% ~ (p=0.305 n=10) +SimulateInternalDelay-8 20.52µ ± 0% 21.42µ ± 1% +4.38% (p=0.000 n=10) +Simulate_DCMotor-8 43.88µ ± 1% 38.05µ ± 1% -13.29% (p=0.000 n=10) +Reg_N100_M5_P5-8 79.78µ ± 4% 59.68µ ± 4% -25.20% (p=0.000 n=10) +D2C_ZOH_N50-8 413.7µ ± 1% 417.9µ ± 1% +1.02% (p=0.001 n=10) +MatLog_N50-8 331.9µ ± 1% 335.6µ ± 0% +1.09% (p=0.000 n=10) +SystemFRD_SISO_10000-8 217.6µ ± 3% 231.0µ ± 3% +6.17% (p=0.000 n=10) +Stabsep_N100-8 8.612m ± 1% 8.658m ± 1% +0.54% (p=0.015 n=10) +Modsep_N50-8 1.433m ± 1% 1.428m ± 0% -0.36% (p=0.011 n=10) +geomean 141.8µ 138.5µ -2.32% + + │ baseline.txt │ candidate.txt │ + │ B/op │ B/op vs base │ +SimulateWithDelay_SISO-8 1.492Ki ± 0% 1.492Ki ± 0% ~ (p=1.000 n=10) ¹ +Reduce-8 52.44Ki ± 0% 52.44Ki ± 0% ~ (p=0.697 n=10) +DiscretizeZOH-8 21.66Ki ± 0% 21.66Ki ± 0% ~ (p=0.810 n=10) +SimulateInternalDelay-8 2.000Ki ± 0% 2.000Ki ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 19.67Ki ± 0% 16.28Ki ± 0% -17.23% (p=0.000 n=10) +Reg_N100_M5_P5-8 424.2Ki ± 0% 421.4Ki ± 0% -0.66% (p=0.000 n=10) +D2C_ZOH_N50-8 463.2Ki ± 0% 463.4Ki ± 0% ~ (p=0.315 n=10) +MatLog_N50-8 391.2Ki ± 0% 391.1Ki ± 0% ~ (p=0.739 n=10) +SystemFRD_SISO_10000-8 922.6Ki ± 0% 922.7Ki ± 0% +0.01% (p=0.001 n=10) +Stabsep_N100-8 2.527Mi ± 1% 2.536Mi ± 1% +0.35% (p=0.015 n=10) +Modsep_N50-8 643.0Ki ± 0% 640.7Ki ± 0% -0.36% (p=0.005 n=10) +geomean 97.84Ki 96.12Ki -1.76% +¹ all samples are equal + + │ baseline.txt │ candidate.txt │ + │ allocs/op │ allocs/op vs base │ +SimulateWithDelay_SISO-8 19.00 ± 0% 19.00 ± 0% ~ (p=1.000 n=10) ¹ +Reduce-8 170.0 ± 0% 170.0 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeZOH-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +SimulateInternalDelay-8 11.00 ± 0% 11.00 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 45.00 ± 0% 11.00 ± 0% -75.56% (p=0.000 n=10) +Reg_N100_M5_P5-8 55.00 ± 0% 25.00 ± 0% -54.55% (p=0.000 n=10) +D2C_ZOH_N50-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N50-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) +SystemFRD_SISO_10000-8 60.00 ± 2% 61.00 ± 0% +1.67% (p=0.003 n=10) +Stabsep_N100-8 480.0 ± 0% 484.0 ± 0% +0.83% (p=0.000 n=10) +Modsep_N50-8 144.0 ± 1% 143.0 ± 1% -0.69% (p=0.023 n=10) +geomean 56.10 46.02 -17.97% +¹ all samples are equal diff --git a/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-candidate.txt.gz b/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/focused-candidate.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..07ddc742391490d836dcc0d4232fcf7d8df89299 GIT binary patch literal 1532 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 to compute geomean + + │ baseline.txt │ candidate.txt │ + │ allocs/op │ allocs/op vs base │ +SimulateWithDelay_SISO-8 19.00 ± 0% 19.00 ± 0% ~ (p=1.000 n=10) ¹ +SimulateWithDelay_MIMO-8 20.00 ± 0% 20.00 ± 0% ~ (p=1.000 n=10) ¹ +BilinearDiscretize-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +TransferFunction_MIMO-8 162.0 ± 0% 162.0 ± 0% ~ (p=1.000 n=10) ¹ +Reduce-8 170.0 ± 0% 170.0 ± 0% ~ (p=1.000 n=10) ¹ +AbsorbDelay-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeZOH-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +DenseNorm-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ +Series-8 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹ +Parallel-8 9.000 ± 0% 9.000 ± 0% ~ (p=1.000 n=10) ¹ +Feedback-8 63.00 ± 0% 63.00 ± 0% ~ (p=1.000 n=10) ¹ +FeedbackLFT-8 273.0 ± 0% 273.0 ± 0% ~ (p=1.000 n=10) ¹ +Append-8 9.000 ± 0% 9.000 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponse-8 126.0 ± 0% 126.0 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponse_ShortSweep-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W2/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W2/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W8/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W8/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W32/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W32/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W100/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N4_W100/TransferFunction-8 77.00 ± 0% 77.00 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W2/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W2/TransferFunction-8 125.0 ± 0% 125.0 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W8/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W8/TransferFunction-8 125.0 ± 0% 125.0 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W32/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W32/TransferFunction-8 125.0 ± 0% 125.0 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W100/StateSpace-8 4.000 ± 0% 4.000 ± 0% ~ (p=1.000 n=10) ¹ +FrequencySweepKernels/N10_W100/TransferFunction-8 125.0 ± 0% 125.0 ± 0% ~ (p=1.000 n=10) ¹ +Bode-8 158.0 ± 0% 158.0 ± 0% ~ (p=1.000 n=10) ¹ +Zeros_SISO-8 102.0 ± 0% 102.0 ± 0% ~ (p=1.000 n=10) ¹ +Zeros_MIMO-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) ¹ +Zeros_NonSquare-8 63.00 ± 0% 63.00 ± 0% ~ (p=1.000 n=10) ¹ +ControllabilityStaircase-8 109.0 ± 0% 109.0 ± 0% ~ (p=1.000 n=10) ¹ +SimulateNoDelay-8 29.00 ± 0% 11.00 ± 0% -62.07% (p=0.000 n=10) +ThiranDelay-8 16.00 ± 0% 16.00 ± 0% ~ (p=1.000 n=10) ¹ +PadeDelay-8 16.00 ± 0% 16.00 ± 0% ~ (p=1.000 n=10) ¹ +DecomposeIODelay-8 7.000 ± 0% 7.000 ± 0% ~ (p=1.000 n=10) ¹ +PullDelaysToLFT-8 44.00 ± 0% 44.00 ± 0% ~ (p=1.000 n=10) ¹ +GetDelayModel-8 44.00 ± 0% 44.00 ± 0% ~ (p=1.000 n=10) ¹ +SetDelayModel-8 21.00 ± 0% 21.00 ± 0% ~ (p=1.000 n=10) ¹ +AbsorbInternalDelay-8 40.00 ± 0% 40.00 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeWithOpts_Thiran-8 72.00 ± 0% 72.00 ± 0% ~ (p=1.000 n=10) ¹ +DiscretizeWithOpts_IODelayThiran-8 81.00 ± 0% 81.00 ± 0% ~ (p=1.000 n=10) ¹ +FeedbackApproximatedDelays-8 82.00 ± 0% 82.00 ± 0% ~ (p=1.000 n=10) ¹ +SimulateInternalDelay-8 11.00 ± 0% 11.00 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponseWithDelay-8 87.00 ± 0% 87.00 ± 0% ~ (p=1.000 n=10) ¹ +PadeSystem-8 173.0 ± 0% 173.0 ± 0% ~ (p=1.000 n=10) ¹ +ZeroDelayApprox-8 26.00 ± 0% 26.00 ± 0% ~ (p=1.000 n=10) ¹ +IsStrictlyUpperTriangular-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=10) ¹ +FreqResponseLFT-8 17.00 ± 0% 17.00 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_DCMotor-8 45.00 ± 0% 11.00 ± 0% -75.56% (p=0.000 n=10) +FreqResponse_B747Lateral-8 72.00 ± 0% 72.00 ± 0% ~ (p=1.000 n=10) ¹ +Simulate_MassSpringDamper-8 29.00 ± 0% 11.00 ± 0% -62.07% (p=0.000 n=10) +DiscretizeAndSimulate_B747Longitudinal-8 21.00 ± 0% 11.00 ± 0% -47.62% (p=0.000 n=10) +Simulate_Large-8 45.00 ± 0% 11.00 ± 0% -75.56% (p=0.000 n=10) +FeedbackAndSimulate-8 21.00 ± 0% 11.00 ± 0% -47.62% (p=0.000 n=10) +Bode_LargeMIMO-8 258.0 ± 0% 258.0 ± 0% ~ (p=1.000 n=10) +Lyap_N10-8 22.00 ± 0% 22.00 ± 0% ~ (p=1.000 n=10) ¹ +Lyap_N50-8 63.00 ± 0% 63.00 ± 0% ~ (p=1.000 n=10) ¹ +Lyap_N100-8 363.0 ± 0% 364.0 ± 0% +0.28% (p=0.000 n=10) +DLyap_N10-8 26.00 ± 0% 26.00 ± 0% ~ (p=1.000 n=10) ¹ +DLyap_N50-8 95.00 ± 0% 95.00 ± 0% ~ (p=1.000 n=10) ¹ +DLyap_N100-8 1.619k ± 0% 1.619k ± 0% ~ (p=0.474 n=10) +Care_N10_M2-8 37.00 ± 0% 37.00 ± 0% ~ (p=1.000 n=10) ¹ +Care_N50_M5-8 758.0 ± 0% 758.0 ± 0% ~ (p=1.000 n=10) ¹ +Care_N100_M5-8 2.066k ± 0% 2.023k ± 0% -2.08% (p=0.000 n=10) +Dare_N10_M2-8 34.00 ± 0% 34.00 ± 0% ~ (p=1.000 n=10) ¹ +Dare_N50_M5-8 781.0 ± 0% 781.0 ± 0% ~ (p=1.000 n=10) ¹ +Dare_N100_M5-8 4.051k ± 0% 4.008k ± 0% -1.06% (p=0.000 n=10) +Gram-8 59.00 ± 0% 59.00 ± 0% ~ (p=1.000 n=10) ¹ +Ctrb-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +H2Norm-8 56.00 ± 0% 56.00 ± 0% ~ (p=1.000 n=10) ¹ +HSV-8 93.00 ± 0% 93.00 ± 0% ~ (p=1.000 n=10) ¹ +HinfNorm-8 1.446k ± 0% 1.446k ± 0% ~ (p=1.000 n=10) +H2Syn_Simple-8 221.0 ± 0% 221.0 ± 0% ~ (p=1.000 n=10) ¹ +HinfSyn_Simple-8 3.107k ± 0% 3.107k ± 0% ~ (p=1.000 n=10) +Balreal-8 88.00 ± 0% 88.00 ± 0% ~ (p=1.000 n=10) ¹ +Balred-8 97.00 ± 0% 97.00 ± 0% ~ (p=1.000 n=10) ¹ +Place_N10_M2-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Place_N50_M5-8 75.00 ± 0% 75.00 ± 0% ~ (p=1.000 n=10) ¹ +Place_N100_M5-8 337.0 ± 0% 337.0 ± 0% ~ (p=1.000 n=10) ¹ +Acker_N5-8 19.00 ± 0% 19.00 ± 0% ~ (p=1.000 n=10) ¹ +Acker_N10-8 22.00 ± 0% 22.00 ± 0% ~ (p=1.000 n=10) ¹ +Lqr_N10_M2-8 37.00 ± 0% 37.00 ± 0% ~ (p=1.000 n=10) ¹ +Lqr_N50_M5-8 758.0 ± 0% 758.0 ± 0% ~ (p=1.000 n=10) ¹ +Lqr_N100_M5-8 2.067k ± 0% 2.018k ± 0% -2.35% (p=0.000 n=10) +Kalman_N10_M2_P3-8 103.0 ± 0% 103.0 ± 0% ~ (p=1.000 n=10) ¹ +Kalman_N50_M5_P5-8 2.191k ± 0% 2.191k ± 0% ~ (p=1.000 n=10) ¹ +Kalman_N100_M5_P5-8 4.336k ± 0% 4.277k ± 0% -1.35% (p=0.000 n=10) +Estim_N10_M2_P3-8 21.00 ± 0% 21.00 ± 0% ~ (p=1.000 n=10) ¹ +Estim_N50_M5_P5-8 21.00 ± 0% 21.00 ± 0% ~ (p=1.000 n=10) ¹ +Estim_N100_M5_P5-8 31.00 ± 0% 21.00 ± 0% -32.26% (p=0.000 n=10) +Reg_N10_M2_P3-8 25.00 ± 0% 25.00 ± 0% ~ (p=1.000 n=10) ¹ +Reg_N50_M5_P5-8 25.00 ± 0% 25.00 ± 0% ~ (p=1.000 n=10) ¹ +Reg_N100_M5_P5-8 55.00 ± 0% 25.00 ± 0% -54.55% (p=0.000 n=10) +PolyRoots_N10-8 41.00 ± 0% 41.00 ± 0% ~ (p=1.000 n=10) ¹ +ZPKEval_SISO-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +ZPKFreqResponse_SISO_100-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +ZPKToTF_SISO_N10-8 21.00 ± 0% 21.00 ± 0% ~ (p=1.000 n=10) ¹ +TFToZPK_SISO_N10-8 90.00 ± 0% 90.00 ± 0% ~ (p=1.000 n=10) ¹ +SSToZPK_SISO-8 130.0 ± 0% 130.0 ± 0% ~ (p=1.000 n=10) ¹ +ZPKToSS_SISO-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +PolyFromComplexRoots_N20-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +Sigma_SISO-8 72.00 ± 0% 72.00 ± 0% ~ (p=1.000 n=10) ¹ +Sigma_MIMO-8 85.00 ± 0% 85.00 ± 0% ~ (p=1.000 n=10) ¹ +Nichols-8 74.00 ± 0% 74.00 ± 0% ~ (p=1.000 n=10) ¹ +Nyquist-8 96.00 ± 0% 96.00 ± 0% ~ (p=1.000 n=10) ¹ +FreqRespEst_SISO-8 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹ +FreqRespEst_MIMO-8 17.00 ± 0% 17.00 ± 0% ~ (p=1.000 n=10) ¹ +BlkDiag-8 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹ +Connect-8 38.00 ± 0% 38.00 ± 0% ~ (p=1.000 n=10) ¹ +LFT-8 74.00 ± 0% 74.00 ± 0% ~ (p=1.000 n=10) ¹ +LFT_Large-8 74.00 ± 0% 74.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N2-8 46.00 ± 0% 46.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N5-8 48.00 ± 0% 48.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N20-8 50.00 ± 0% 50.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_ZOH_N50-8 53.00 ± 0% 53.00 ± 0% ~ (p=1.000 n=10) ¹ +D2C_Tustin_N20-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N20-8 30.00 ± 0% 30.00 ± 0% ~ (p=1.000 n=10) ¹ +MatLog_N50-8 32.00 ± 0% 32.00 ± 0% ~ (p=1.000 n=10) +DCGain_StableMIMO_N10_M4_P6-8 13.00 ± 0% 13.00 ± 0% ~ (p=1.000 n=10) ¹ +DCGain_IntegratorMIMO_N10_M4_P6-8 33.00 ± 0% 33.00 ± 0% ~ (p=1.000 n=10) ¹ +DCGain_IntegratorMIMO_N40_M8_P8-8 34.00 ± 0% 34.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_200-8 60.00 ± 0% 60.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_2000-8 60.00 ± 0% 60.00 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_SISO_10000-8 60.50 ± 1% 61.00 ± 0% +0.83% (p=0.033 n=10) +SystemFRD_MIMO_200-8 120.0 ± 0% 120.0 ± 0% ~ (p=1.000 n=10) ¹ +SystemFRD_MIMO_2000-8 125.0 ± 2% 124.0 ± 1% ~ (p=0.097 n=10) +SystemFRD_MIMO_10000-8 129.0 ± 1% 129.0 ± 1% ~ (p=1.000 n=10) +SystemFRD_Large_2000-8 211.0 ± 0% 211.0 ± 0% ~ (p=0.230 n=10) +FRDSigma_SISO_200-8 3.000 ± 0% 3.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_SISO_2000-8 3.000 ± 0% 3.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO_200-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO_2000-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO_10000-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_Large_2000-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_10000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDMargin_NegGM_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSigma_MIMO5x5_2000-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_SISO_200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_SISO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_MIMO_200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_MIMO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSeries_MIMO_10000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDParallel_SISO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDParallel_MIMO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_SISO_200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_SISO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO_200-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO_2000-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO_10000-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDFeedback_MIMO8x8_2000-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDAbs_MIMO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDSelectFrequencies_MIMO_2000-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FRDPeakGain_MIMO_2000-8 6.000 ± 0% 6.000 ± 0% ~ (p=1.000 n=10) ¹ +ModelArrayFreqResponse_MIMO_16x200-8 1.620k ± 0% 1.620k ± 0% ~ (p=1.000 n=10) +ModelArrayFreqResponseManualLoop_MIMO_16x200-8 1.615k ± 0% 1.615k ± 0% ~ (p=1.000 n=10) +Step_SISO_N2-8 54.00 ± 0% 54.00 ± 0% ~ (p=1.000 n=10) ¹ +Step_SISO_N10-8 101.00 ± 0% 73.00 ± 0% -27.72% (p=0.000 n=10) +Step_SISO_N50-8 252.5 ± 1% 134.0 ± 0% -46.93% (p=0.000 n=10) +Step_MIMO_N10-8 62.00 ± 0% 62.00 ± 0% ~ (p=1.000 n=10) ¹ +StepInfo_SISO_N10-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +StepInfo_MIMO_N10-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +ModelArrayStep_MIMO_16-8 883.0 ± 0% 882.0 ± 0% ~ (p=0.115 n=10) +ModelArrayStepManualLoop_MIMO_16-8 877.0 ± 0% 877.0 ± 0% ~ (p=0.635 n=10) +Impulse_SISO_N2-8 54.00 ± 0% 54.00 ± 0% ~ (p=1.000 n=10) ¹ +Impulse_SISO_N10-8 101.00 ± 0% 73.00 ± 0% -27.72% (p=0.000 n=10) +Impulse_SISO_N50-8 252.0 ± 0% 134.0 ± 1% -46.83% (p=0.000 n=10) +Impulse_MIMO_N10-8 62.00 ± 0% 62.00 ± 0% ~ (p=1.000 n=10) ¹ +Lsim_SISO_N2-8 58.00 ± 0% 40.00 ± 0% -31.03% (p=0.000 n=10) +Lsim_SISO_N10-8 60.00 ± 0% 42.00 ± 0% -30.00% (p=0.000 n=10) +Lsim_SISO_N50-8 62.00 ± 0% 44.00 ± 0% -29.03% (p=0.000 n=10) +Lsim_MIMO_N10-8 60.00 ± 0% 42.00 ± 0% -30.00% (p=0.000 n=10) +Lsim_SISO_1e4-8 361.00 ± 0% 43.00 ± 0% -88.09% (p=0.000 n=10) +Lsim_MIMO_1e4-8 368.00 ± 0% 45.50 ± 3% -87.64% (p=0.000 n=10) +Lsim_Discrete_SISO-8 48.00 ± 0% 14.00 ± 0% -70.83% (p=0.000 n=10) +Loopsens_SISO_N2-8 227.0 ± 0% 227.0 ± 0% ~ (p=1.000 n=10) ¹ +Loopsens_SISO_N10-8 227.0 ± 0% 227.0 ± 0% ~ (p=1.000 n=10) ¹ +Loopsens_MIMO_N10-8 227.0 ± 0% 227.0 ± 0% ~ (p=1.000 n=10) ¹ +Canon_Modal_N2-8 36.00 ± 0% 36.00 ± 0% ~ (p=1.000 n=10) ¹ +Canon_Modal_N10-8 54.00 ± 0% 54.00 ± 0% ~ (p=1.000 n=10) ¹ +Canon_Modal_N50-8 113.0 ± 1% 112.0 ± 1% ~ (p=0.070 n=10) +Canon_Modal_N100-8 2.014k ± 0% 2.014k ± 0% ~ (p=0.885 n=10) +Canon_Comp_N2-8 49.00 ± 0% 49.00 ± 0% ~ (p=1.000 n=10) ¹ +Canon_Comp_N10-8 100.0 ± 0% 100.0 ± 0% ~ (p=1.000 n=10) ¹ +DescriptorToExplicit_N10-8 22.00 ± 0% 22.00 ± 0% ~ (p=1.000 n=10) ¹ +DescriptorFreqResponse_MIMO_N10x200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +DescriptorFreqResponse_MIMO_N50x200-8 5.000 ± 0% 5.000 ± 0% ~ (p=1.000 n=10) ¹ +FixedInputReduction_N10-8 10.00 ± 0% 10.00 ± 0% ~ (p=1.000 n=10) ¹ +TunableGainCurrentSystem_4x4-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +TunableGainSampleCurrentSystem_4x4-8 30.00 ± 0% 30.00 ± 0% ~ (p=1.000 n=10) ¹ +GeneralizedCurrentSystem_SISO-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=10) ¹ +GeneralizedClosedLoop_SISO-8 68.00 ± 0% 68.00 ± 0% ~ (p=1.000 n=10) ¹ +TuningGoalWeightedGain_SISO-8 82.00 ± 0% 82.00 ± 0% ~ (p=1.000 n=10) ¹ +TuningGoalWeightedGain_MIMO-8 113.0 ± 0% 113.0 ± 0% ~ (p=1.000 n=10) ¹ +TuningGoalDynamicWeightedGain_MIMO-8 247.0 ± 0% 247.0 ± 0% ~ (p=1.000 n=10) ¹ +Systune_SISO-8 688.0 ± 0% 688.0 ± 0% ~ (p=1.000 n=10) +Systune_MIMO-8 1.287k ± 0% 1.286k ± 0% -0.08% (p=0.023 n=10) +PhysicalAssembly_8Components-8 306.0 ± 0% 306.0 ± 0% ~ (p=1.000 n=10) ¹ +ModalTruncate_N50_Order10-8 156.0 ± 0% 156.0 ± 0% ~ (p=1.000 n=10) ¹ +Passivity_SISO-8 63.00 ± 0% 63.00 ± 0% ~ (p=1.000 n=10) ¹ +FRDPassivity_MIMO-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N2-8 55.00 ± 0% 55.00 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N10-8 79.00 ± 0% 79.00 ± 0% ~ (p=1.000 n=10) ¹ +Stabsep_N50-8 157.0 ± 1% 156.0 ± 1% ~ (p=0.370 n=10) +Stabsep_N100-8 480.5 ± 0% 481.0 ± 0% ~ (p=0.165 n=10) +Modsep_N10-8 79.00 ± 0% 79.00 ± 0% ~ (p=1.000 n=10) ¹ +Modsep_N50-8 144.0 ± 1% 143.5 ± 0% ~ (p=1.000 n=10) +Ssbal_N2-8 12.00 ± 0% 12.00 ± 0% ~ (p=1.000 n=10) ¹ +Ssbal_N10-8 13.00 ± 0% 13.00 ± 0% ~ (p=1.000 n=10) ¹ +Ssbal_N50-8 13.00 ± 0% 13.00 ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N2-8 19.00 ± 0% 19.00 ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N10-8 20.00 ± 0% 20.00 ± 0% ~ (p=1.000 n=10) ¹ +Prescale_N50-8 20.00 ± 0% 20.00 ± 0% ~ (p=1.000 n=10) ¹ +Sminreal_N2-8 9.000 ± 0% 9.000 ± 0% ~ (p=1.000 n=10) ¹ +Sminreal_N10-8 11.00 ± 0% 11.00 ± 0% ~ (p=1.000 n=10) ¹ +Sminreal_N50-8 15.00 ± 0% 15.00 ± 0% ~ (p=1.000 n=10) ¹ +Inv_SISO_N2-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Inv_SISO_N10-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Inv_MIMO_N10-8 28.00 ± 0% 28.00 ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N2-8 29.00 ± 0% 29.00 ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N10-8 26.00 ± 0% 26.00 ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N50-8 83.00 ± 0% 83.00 ± 0% ~ (p=1.000 n=10) ¹ +Covar_SISO_N100-8 939.0 ± 0% 939.0 ± 0% ~ (p=1.000 n=10) ¹ +Covar_MIMO_N10-8 26.00 ± 0% 26.00 ± 0% ~ (p=1.000 n=10) ¹ +Pidtune_PI-8 94.00 ± 0% 94.00 ± 0% ~ (p=1.000 n=10) ¹ +Pidtune_PID-8 94.00 ± 0% 94.00 ± 0% ~ (p=1.000 n=10) ¹ +Pidtune_PIDF-8 94.00 ± 0% 94.00 ± 0% ~ (p=1.000 n=10) ¹ +Margin_SISO-8 85.00 ± 0% 85.00 ± 0% ~ (p=1.000 n=10) ¹ +Bandwidth_SISO-8 71.00 ± 0% 71.00 ± 0% ~ (p=1.000 n=10) ¹ +DiskMargin_SISO-8 97.00 ± 0% 97.00 ± 0% ~ (p=1.000 n=10) ¹ +geomean ² -6.60% ² +¹ all samples are equal +² summaries must be >0 to compute geomean diff --git a/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/full-candidate.txt.gz b/docs/benchmarks/gonum-v0.19.0/go1.27.1-full/full-candidate.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..58653ad3c2fd70c2845ecfdc318f3fba2532a5a6 GIT binary patch literal 29433 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