Skip to content

test: verify the benchmark regression gate (DO NOT MERGE) - #1

Closed
juicycleff wants to merge 1 commit into
mainfrom
test/bench-gate-verification
Closed

juicycleff wants to merge 1 commit into
mainfrom
test/bench-gate-verification

Conversation

@juicycleff

Copy link
Copy Markdown
Contributor

Throwaway PR — do not merge. Close once the gate is confirmed.

Exists to prove .github/workflows/bench.yml actually fails a pull request when
benchmarks regress. A gate that has never been seen to fire is unverified.

What this changes

Four redundant passes over the input in histogramOp.Apply, marked with a
loud DO NOT MERGE comment. Nothing else.

Expected result

The Bench check should fail, with a comment on this PR showing roughly:

Pipe/histogram/n=100-16     +110% (p=0.002 n=6)
Pipe/histogram/n=1000-16    +166% (p=0.002 n=6)
Pipe/histogram/n=10000-16   +177% (p=0.002 n=6)

Measured locally against main at -benchtime=100ms -count=6.

If Bench passes, the gate is broken and needs fixing before it is trusted.

What this confirms

  • base and head checkout in a single job on one runner
  • benchstat installs and parses
  • scripts/bench-gate.sh reads the CSV and applies the 20% threshold
  • the result gets posted back as a PR comment
  • unrelated benchmarks stay quiet (no false positives across the other 16 operators)

🤖 Generated with Claude Code

DO NOT MERGE. Adds four redundant passes over the input in histogramOp.Apply
so the pull-request benchmark gate has a real regression to catch.

Measured locally: +110% at n=100, +166% at n=1000, +177% at n=10000, all
significant at p=0.002. scripts/bench-gate.sh exits 1 on this.
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Benchmark comparison

goos: linux
goarch: amd64
pkg: github.com/xraph/dql/exec
cpu: AMD EPYC 7763 64-Core Processor                
                                  │ /tmp/old.txt │            /tmp/new.txt            │
                                  │    sec/op    │    sec/op     vs base              │
ExecuteEndToEnd/classic/n=100-4     50.47µ ± 18%   49.20µ ±  2%  -2.52% (p=0.009 n=6)
ExecuteEndToEnd/classic/n=1000-4    552.3µ ±  1%   546.9µ ±  3%       ~ (p=0.394 n=6)
ExecuteEndToEnd/classic/n=10000-4   5.731m ±  4%   5.711m ± 23%       ~ (p=0.818 n=6)
ExecuteEndToEnd/pipe/n=100-4        93.94µ ±  1%   91.94µ ±  2%  -2.12% (p=0.009 n=6)
ExecuteEndToEnd/pipe/n=1000-4       755.5µ ± 28%   749.5µ ±  1%       ~ (p=0.240 n=6)
ExecuteEndToEnd/pipe/n=10000-4      7.036m ±  2%   6.982m ±  2%       ~ (p=0.699 n=6)
geomean                             656.1µ         647.8µ        -1.26%

                                  │ /tmp/old.txt │            /tmp/new.txt            │
                                  │    rows/s    │    rows/s     vs base              │
ExecuteEndToEnd/classic/n=100-4     1.981M ± 15%   2.032M ±  2%  +2.58% (p=0.009 n=6)
ExecuteEndToEnd/classic/n=1000-4    1.811M ±  1%   1.829M ±  3%       ~ (p=0.394 n=6)
ExecuteEndToEnd/classic/n=10000-4   1.745M ±  5%   1.751M ± 19%       ~ (p=0.818 n=6)
ExecuteEndToEnd/pipe/n=100-4        1.065M ±  1%   1.088M ±  2%  +2.17% (p=0.009 n=6)
ExecuteEndToEnd/pipe/n=1000-4       1.324M ± 22%   1.334M ±  1%       ~ (p=0.240 n=6)
ExecuteEndToEnd/pipe/n=10000-4      1.421M ±  2%   1.432M ±  2%       ~ (p=0.699 n=6)
geomean                             1.524M         1.544M        +1.28%

                                  │ /tmp/old.txt │            /tmp/new.txt            │
                                  │     B/op     │     B/op      vs base              │
ExecuteEndToEnd/classic/n=100-4     56.76Ki ± 0%   56.76Ki ± 0%       ~ (p=0.729 n=6)
ExecuteEndToEnd/classic/n=1000-4    543.0Ki ± 0%   543.0Ki ± 0%       ~ (p=0.165 n=6)
ExecuteEndToEnd/classic/n=10000-4   5.410Mi ± 0%   5.410Mi ± 0%       ~ (p=0.619 n=6)
ExecuteEndToEnd/pipe/n=100-4        81.44Ki ± 0%   81.44Ki ± 0%       ~ (p=0.374 n=6)
ExecuteEndToEnd/pipe/n=1000-4       592.3Ki ± 0%   592.3Ki ± 0%       ~ (p=0.258 n=6)
ExecuteEndToEnd/pipe/n=10000-4      5.686Mi ± 0%   5.686Mi ± 0%       ~ (p=0.461 n=6)
geomean                             602.7Ki        602.7Ki       -0.00%

                                  │ /tmp/old.txt │            /tmp/new.txt             │
                                  │  allocs/op   │  allocs/op   vs base                │
ExecuteEndToEnd/classic/n=100-4       635.0 ± 0%    635.0 ± 0%       ~ (p=1.000 n=6) ¹
ExecuteEndToEnd/classic/n=1000-4     6.038k ± 0%   6.038k ± 0%       ~ (p=0.182 n=6)
ExecuteEndToEnd/classic/n=10000-4    60.05k ± 0%   60.05k ± 0%       ~ (p=1.000 n=6) ¹
ExecuteEndToEnd/pipe/n=100-4          994.0 ± 0%    994.0 ± 0%       ~ (p=1.000 n=6) ¹
ExecuteEndToEnd/pipe/n=1000-4        7.358k ± 0%   7.358k ± 0%       ~ (p=1.000 n=6) ¹
ExecuteEndToEnd/pipe/n=10000-4       70.45k ± 0%   70.45k ± 0%       ~ (p=0.455 n=6)
geomean                              7.010k        7.010k       +0.00%
¹ all samples are equal

pkg: github.com/xraph/dql/parser
                  │ /tmp/old.txt │           /tmp/new.txt            │
                  │    sec/op    │   sec/op     vs base              │
Parse/simple-4       5.358µ ± 2%   5.346µ ± 1%       ~ (p=0.513 n=6)
Parse/pipe-4         19.83µ ± 1%   20.03µ ± 2%  +1.02% (p=0.035 n=6)
Validate/simple-4    114.5n ± 1%   114.9n ± 9%       ~ (p=0.054 n=6)
Validate/pipe-4      8.014µ ± 2%   8.146µ ± 7%  +1.64% (p=0.041 n=6)
geomean              3.142µ        3.164µ       +0.69%

                  │ /tmp/old.txt │             /tmp/new.txt             │
                  │     B/op     │     B/op      vs base                │
Parse/simple-4      1.891Ki ± 0%   1.891Ki ± 0%       ~ (p=1.000 n=6) ¹
Parse/pipe-4        6.391Ki ± 0%   6.391Ki ± 0%       ~ (p=1.000 n=6) ¹
Validate/simple-4     16.00 ± 0%     16.00 ± 0%       ~ (p=1.000 n=6) ¹
Validate/pipe-4     2.414Ki ± 0%   2.414Ki ± 0%       ~ (p=1.000 n=6) ¹
geomean               841.4          841.4       +0.00%
¹ all samples are equal

                  │ /tmp/old.txt │            /tmp/new.txt            │
                  │  allocs/op   │ allocs/op   vs base                │
Parse/simple-4        35.00 ± 0%   35.00 ± 0%       ~ (p=1.000 n=6) ¹
Parse/pipe-4          125.0 ± 0%   125.0 ± 0%       ~ (p=1.000 n=6) ¹
Validate/simple-4     1.000 ± 0%   1.000 ± 0%       ~ (p=1.000 n=6) ¹
Validate/pipe-4       61.00 ± 0%   61.00 ± 0%       ~ (p=1.000 n=6) ¹
geomean               22.73        22.73       +0.00%
¹ all samples are equal

pkg: github.com/xraph/dql/pipe
                               │ /tmp/old.txt │             /tmp/new.txt              │
                               │    sec/op    │    sec/op      vs base                │
Pipe/filter/n=100-4              14.34µ ±  1%    14.72µ ±  2%    +2.61% (p=0.026 n=6)
Pipe/filter/n=1000-4             145.6µ ± 25%    146.5µ ±  2%         ~ (p=0.818 n=6)
Pipe/filter/n=10000-4            1.465m ±  1%    1.508m ±  3%    +2.96% (p=0.009 n=6)
Pipe/groupBy/n=100-4             1.874n ±  0%    1.904n ±  2%         ~ (p=0.106 n=6)
Pipe/groupBy/n=1000-4            1.871n ±  0%    1.896n ±  3%    +1.39% (p=0.006 n=6)
Pipe/groupBy/n=10000-4           1.893n ±  5%    1.872n ±  2%         ~ (p=0.229 n=6)
Pipe/aggregate/n=100-4           20.82µ ±  1%    20.99µ ±  3%         ~ (p=0.310 n=6)
Pipe/aggregate/n=1000-4          133.2µ ±  1%    136.1µ ±  2%    +2.16% (p=0.002 n=6)
Pipe/aggregate/n=10000-4         1.224m ±  2%    1.236m ±  2%    +1.00% (p=0.041 n=6)
Pipe/sort/n=100-4                5.538µ ±  5%    6.596µ ±  2%   +19.10% (p=0.002 n=6)
Pipe/sort/n=1000-4               56.64µ ±  2%    68.00µ ±  1%   +20.06% (p=0.002 n=6)
Pipe/sort/n=10000-4              787.1µ ±  2%    876.9µ ±  1%   +11.41% (p=0.002 n=6)
Pipe/distinct/n=100-4            11.06µ ±  2%    11.06µ ±  2%         ~ (p=0.937 n=6)
Pipe/distinct/n=1000-4           116.4µ ±  1%    118.6µ ±  4%    +1.88% (p=0.002 n=6)
Pipe/distinct/n=10000-4          1.172m ±  3%    1.188m ± 20%         ~ (p=0.132 n=6)
Pipe/dedupe/n=100-4              10.91µ ±  2%    10.86µ ±  1%         ~ (p=0.589 n=6)
Pipe/dedupe/n=1000-4             115.3µ ±  1%    115.6µ ±  1%         ~ (p=0.589 n=6)
Pipe/dedupe/n=10000-4            1.161m ±  3%    1.168m ±  2%         ~ (p=0.394 n=6)
Pipe/window/n=100-4              31.25µ ±  2%    30.89µ ±  1%         ~ (p=0.240 n=6)
Pipe/window/n=1000-4             580.7µ ±  2%    576.6µ ±  4%         ~ (p=0.180 n=6)
Pipe/window/n=10000-4            9.190m ±  9%   10.120m ±  9%   +10.12% (p=0.015 n=6)
Pipe/topPerGroup/n=100-4         27.71µ ±  2%    27.58µ ±  1%         ~ (p=0.180 n=6)
Pipe/topPerGroup/n=1000-4        503.6µ ±  2%    495.0µ ±  1%    -1.71% (p=0.002 n=6)
Pipe/topPerGroup/n=10000-4       7.825m ±  1%    7.669m ±  2%    -1.99% (p=0.004 n=6)
Pipe/histogram/n=100-4           5.548µ ±  1%   12.063µ ±  1%  +117.45% (p=0.002 n=6)
Pipe/histogram/n=1000-4          39.40µ ±  1%   107.67µ ±  1%  +173.27% (p=0.002 n=6)
Pipe/histogram/n=10000-4         385.5µ ±  1%   1109.7µ ±  3%  +187.87% (p=0.002 n=6)
Pipe/pivot/n=100-4               63.12µ ±  2%    62.08µ ±  2%    -1.65% (p=0.041 n=6)
Pipe/pivot/n=1000-4              521.1µ ±  2%    505.8µ ±  2%    -2.94% (p=0.015 n=6)
Pipe/pivot/n=10000-4             4.845m ±  1%    4.889m ±  2%    +0.92% (p=0.004 n=6)
Pipe/unpivot/n=100-4             21.77µ ±  2%    21.77µ ±  2%         ~ (p=0.937 n=6)
Pipe/unpivot/n=1000-4            281.6µ ±  4%    276.5µ ±  1%    -1.79% (p=0.004 n=6)
Pipe/unpivot/n=10000-4           2.617m ±  2%    2.613m ±  3%         ~ (p=0.818 n=6)
Pipe/gapfill/n=100-4             11.86µ ±  1%    12.04µ ±  1%    +1.50% (p=0.004 n=6)
Pipe/gapfill/n=1000-4            122.7µ ±  5%    123.6µ ±  0%         ~ (p=0.093 n=6)
Pipe/gapfill/n=10000-4           1.354m ±  2%    1.371m ±  1%    +1.29% (p=0.015 n=6)
PipeJoins/lookup/n=100-4         260.9µ ±  2%    264.8µ ±  2%         ~ (p=0.065 n=6)
PipeJoins/lookup/n=1000-4        1.735m ±  2%    1.751m ±  1%         ~ (p=0.240 n=6)
PipeJoins/lookup/n=10000-4       14.89m ±  2%    15.18m ±  2%    +1.91% (p=0.041 n=6)
PipeJoins/asofJoin/n=100-4       266.6µ ±  1%    257.5µ ±  1%    -3.43% (p=0.002 n=6)
PipeJoins/asofJoin/n=1000-4      1.883m ±  2%    1.887m ±  1%         ~ (p=0.240 n=6)
PipeJoins/asofJoin/n=10000-4     15.92m ±  3%    16.34m ± 15%         ~ (p=0.093 n=6)
PipeJoins/crossJoin/n=100-4      1.277m ±  3%    1.278m ±  2%         ~ (p=0.937 n=6)
PipeJoins/crossJoin/n=1000-4     14.65m ±  2%    14.71m ±  3%         ~ (p=0.394 n=6)
PipeJoins/crossJoin/n=10000-4    151.3m ±  2%    146.3m ±  6%         ~ (p=0.180 n=6)
PipeSetOps/except/n=100-4        112.8µ ±  2%    114.4µ ±  1%    +1.38% (p=0.009 n=6)
PipeSetOps/except/n=1000-4       1.256m ±  2%    1.260m ±  2%         ~ (p=0.937 n=6)
PipeSetOps/except/n=10000-4      12.97m ±  2%    12.93m ±  1%         ~ (p=0.818 n=6)
PipeSetOps/intersect/n=100-4     125.8µ ±  1%    123.3µ ±  1%    -1.95% (p=0.002 n=6)
PipeSetOps/intersect/n=1000-4    1.404m ±  2%    1.360m ±  2%    -3.14% (p=0.002 n=6)
PipeSetOps/intersect/n=10000-4   14.44m ±  2%    14.47m ±  3%         ~ (p=0.699 n=6)
geomean                          190.9µ          204.2µ          +6.99%

                               │ /tmp/old.txt  │            /tmp/new.txt             │
                               │    rows/s     │    rows/s     vs base               │
Pipe/filter/n=100-4               6.973M ±  1%   6.795M ±  3%   -2.54% (p=0.026 n=6)
Pipe/filter/n=1000-4              6.868M ± 20%   6.828M ±  2%        ~ (p=0.818 n=6)
Pipe/filter/n=10000-4             6.826M ±  1%   6.630M ±  3%   -2.87% (p=0.009 n=6)
Pipe/groupBy/n=100-4              53.36G ±  0%   52.53G ±  2%        ~ (p=0.093 n=6)
Pipe/groupBy/n=1000-4             534.6G ±  0%   527.4G ±  3%   -1.35% (p=0.004 n=6)
Pipe/groupBy/n=10000-4            5.284T ±  5%   5.342T ±  2%        ~ (p=0.310 n=6)
Pipe/aggregate/n=100-4            4.803M ±  1%   4.764M ±  3%        ~ (p=0.310 n=6)
Pipe/aggregate/n=1000-4           7.508M ±  1%   7.349M ±  2%   -2.11% (p=0.002 n=6)
Pipe/aggregate/n=10000-4          8.172M ±  2%   8.091M ±  2%   -0.99% (p=0.041 n=6)
Pipe/sort/n=100-4                 18.06M ±  4%   15.16M ±  2%  -16.03% (p=0.002 n=6)
Pipe/sort/n=1000-4                17.66M ±  2%   14.71M ±  1%  -16.71% (p=0.002 n=6)
Pipe/sort/n=10000-4               12.71M ±  2%   11.40M ±  1%  -10.24% (p=0.002 n=6)
Pipe/distinct/n=100-4             9.043M ±  2%   9.038M ±  3%        ~ (p=0.937 n=6)
Pipe/distinct/n=1000-4            8.588M ±  1%   8.430M ±  4%   -1.84% (p=0.002 n=6)
Pipe/distinct/n=10000-4           8.529M ±  3%   8.418M ± 17%        ~ (p=0.132 n=6)
Pipe/dedupe/n=100-4               9.168M ±  2%   9.206M ±  1%        ~ (p=0.589 n=6)
Pipe/dedupe/n=1000-4              8.671M ±  1%   8.654M ±  1%        ~ (p=0.589 n=6)
Pipe/dedupe/n=10000-4             8.614M ±  3%   8.565M ±  1%        ~ (p=0.394 n=6)
Pipe/window/n=100-4               3.200M ±  2%   3.237M ±  1%        ~ (p=0.240 n=6)
Pipe/window/n=1000-4              1.722M ±  2%   1.734M ±  4%        ~ (p=0.180 n=6)
Pipe/window/n=10000-4            1088.2k ±  8%   988.6k ±  8%   -9.14% (p=0.015 n=6)
Pipe/topPerGroup/n=100-4          3.608M ±  2%   3.626M ±  1%        ~ (p=0.180 n=6)
Pipe/topPerGroup/n=1000-4         1.986M ±  2%   2.020M ±  1%   +1.74% (p=0.002 n=6)
Pipe/topPerGroup/n=10000-4        1.278M ±  1%   1.304M ±  2%   +2.03% (p=0.004 n=6)
Pipe/histogram/n=100-4           18.027M ±  1%   8.290M ±  1%  -54.01% (p=0.002 n=6)
Pipe/histogram/n=1000-4          25.381M ±  1%   9.288M ±  1%  -63.41% (p=0.002 n=6)
Pipe/histogram/n=10000-4         25.942M ±  1%   9.012M ±  3%  -65.26% (p=0.002 n=6)
Pipe/pivot/n=100-4                1.584M ±  2%   1.611M ±  2%   +1.68% (p=0.041 n=6)
Pipe/pivot/n=1000-4               1.919M ±  2%   1.977M ±  2%   +3.03% (p=0.015 n=6)
Pipe/pivot/n=10000-4              2.064M ±  1%   2.045M ±  2%   -0.91% (p=0.004 n=6)
Pipe/unpivot/n=100-4              4.594M ±  2%   4.594M ±  2%        ~ (p=0.937 n=6)
Pipe/unpivot/n=1000-4             3.551M ±  4%   3.616M ±  1%   +1.83% (p=0.004 n=6)
Pipe/unpivot/n=10000-4            3.821M ±  2%   3.827M ±  3%        ~ (p=0.818 n=6)
Pipe/gapfill/n=100-4              8.431M ±  1%   8.307M ±  1%   -1.47% (p=0.004 n=6)
Pipe/gapfill/n=1000-4             8.151M ±  5%   8.094M ±  0%        ~ (p=0.093 n=6)
Pipe/gapfill/n=10000-4            7.387M ±  2%   7.293M ±  1%   -1.27% (p=0.015 n=6)
PipeJoins/lookup/n=100-4          383.2k ±  2%   377.6k ±  2%        ~ (p=0.065 n=6)
PipeJoins/lookup/n=1000-4         576.3k ±  1%   571.0k ±  1%        ~ (p=0.240 n=6)
PipeJoins/lookup/n=10000-4        671.4k ±  2%   658.8k ±  2%   -1.88% (p=0.041 n=6)
PipeJoins/asofJoin/n=100-4        375.1k ±  1%   388.4k ±  1%   +3.55% (p=0.002 n=6)
PipeJoins/asofJoin/n=1000-4       531.1k ±  2%   530.1k ±  1%        ~ (p=0.240 n=6)
PipeJoins/asofJoin/n=10000-4      628.2k ±  3%   612.0k ± 13%        ~ (p=0.093 n=6)
PipeJoins/crossJoin/n=100-4       78.28k ±  3%   78.23k ±  2%        ~ (p=0.937 n=6)
PipeJoins/crossJoin/n=1000-4      68.28k ±  2%   67.99k ±  2%        ~ (p=0.394 n=6)
PipeJoins/crossJoin/n=10000-4     66.09k ±  2%   68.35k ±  6%        ~ (p=0.180 n=6)
PipeSetOps/except/n=100-4         886.2k ±  2%   874.1k ±  1%   -1.36% (p=0.009 n=6)
PipeSetOps/except/n=1000-4        796.4k ±  2%   793.8k ±  2%        ~ (p=0.937 n=6)
PipeSetOps/except/n=10000-4       771.2k ±  2%   773.4k ±  1%        ~ (p=0.818 n=6)
PipeSetOps/intersect/n=100-4      795.1k ±  1%   810.9k ±  1%   +1.98% (p=0.002 n=6)
PipeSetOps/intersect/n=1000-4     712.4k ±  2%   735.5k ±  2%   +3.25% (p=0.002 n=6)
PipeSetOps/intersect/n=10000-4    692.7k ±  2%   691.3k ±  3%        ~ (p=0.699 n=6)
geomean                           5.240M         4.898M         -6.53%

                               │  /tmp/old.txt   │             /tmp/new.txt              │
                               │      B/op       │     B/op       vs base                │
Pipe/filter/n=100-4              2.125Ki ±  0%     2.125Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/filter/n=1000-4             20.50Ki ±  0%     20.50Ki ±  0%       ~ (p=0.242 n=6)
Pipe/filter/n=10000-4            205.0Ki ±  0%     205.0Ki ±  0%       ~ (p=0.978 n=6)
Pipe/groupBy/n=100-4               0.000 ±  0%       0.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/groupBy/n=1000-4              0.000 ±  0%       0.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/groupBy/n=10000-4             0.000 ±  0%       0.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/aggregate/n=100-4           12.92Ki ±  0%     12.92Ki ±  0%       ~ (p=1.000 n=6)
Pipe/aggregate/n=1000-4          37.46Ki ±  0%     37.46Ki ±  0%       ~ (p=0.545 n=6)
Pipe/aggregate/n=10000-4         270.4Ki ±  0%     270.4Ki ±  0%       ~ (p=0.478 n=6)
Pipe/sort/n=100-4                  56.00 ±  0%       56.00 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/sort/n=1000-4                 56.00 ±  0%       56.00 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/sort/n=10000-4                56.00 ±  0%       56.00 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/distinct/n=100-4            5.070Ki ±  0%     5.070Ki ±  0%       ~ (p=1.000 n=6)
Pipe/distinct/n=1000-4           69.16Ki ±  0%     69.16Ki ±  0%       ~ (p=0.346 n=6)
Pipe/distinct/n=10000-4          584.8Ki ±  0%     584.8Ki ±  0%       ~ (p=0.368 n=6)
Pipe/dedupe/n=100-4              5.070Ki ±  0%     5.071Ki ±  0%       ~ (p=0.545 n=6)
Pipe/dedupe/n=1000-4             69.16Ki ±  0%     69.16Ki ±  0%       ~ (p=0.693 n=6)
Pipe/dedupe/n=10000-4            584.8Ki ±  0%     584.8Ki ±  0%       ~ (p=0.859 n=6)
Pipe/window/n=100-4              10.79Ki ±  0%     10.79Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/window/n=1000-4             63.84Ki ±  0%     63.84Ki ±  0%       ~ (p=0.589 n=6)
Pipe/window/n=10000-4            600.5Ki ± 77%     600.5Ki ± 72%       ~ (p=1.000 n=6)
Pipe/topPerGroup/n=100-4         8.165Ki ±  0%     8.165Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/topPerGroup/n=1000-4        39.83Ki ±  0%     39.83Ki ±  0%       ~ (p=0.766 n=6)
Pipe/topPerGroup/n=10000-4       344.7Ki ±  0%     344.7Ki ±  0%       ~ (p=0.307 n=6)
Pipe/histogram/n=100-4           3.594Ki ±  0%     3.594Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/histogram/n=1000-4          3.594Ki ±  0%     3.594Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/histogram/n=10000-4         3.672Ki ±  0%     3.672Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/pivot/n=100-4               56.55Ki ±  0%     56.55Ki ±  0%       ~ (p=1.000 n=6)
Pipe/pivot/n=1000-4              403.5Ki ±  0%     403.5Ki ±  0%       ~ (p=0.608 n=6)
Pipe/pivot/n=10000-4             3.733Mi ±  0%     3.733Mi ±  0%       ~ (p=0.970 n=6)
Pipe/unpivot/n=100-4             35.25Ki ±  0%     35.25Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/unpivot/n=1000-4            351.8Ki ±  0%     351.8Ki ±  0%       ~ (p=1.000 n=6)
Pipe/unpivot/n=10000-4           3.435Mi ±  0%     3.435Mi ±  0%       ~ (p=1.000 n=6)
Pipe/gapfill/n=100-4             2.922Ki ±  0%     2.922Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/gapfill/n=1000-4            32.67Ki ±  0%     32.67Ki ±  0%       ~ (p=1.000 n=6) ¹
Pipe/gapfill/n=10000-4           429.3Ki ±  0%     429.3Ki ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/lookup/n=100-4         147.0Ki ±  0%     147.0Ki ±  0%       ~ (p=0.626 n=6)
PipeJoins/lookup/n=1000-4        913.8Ki ±  0%     913.7Ki ±  0%       ~ (p=0.121 n=6)
PipeJoins/lookup/n=10000-4       8.379Mi ±  0%     8.379Mi ±  0%       ~ (p=0.485 n=6)
PipeJoins/asofJoin/n=100-4       103.7Ki ±  0%     103.7Ki ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/asofJoin/n=1000-4      877.2Ki ±  0%     877.2Ki ±  0%       ~ (p=1.000 n=6)
PipeJoins/asofJoin/n=10000-4     8.411Mi ±  0%     8.411Mi ±  0%       ~ (p=0.424 n=6)
PipeJoins/crossJoin/n=100-4      833.2Ki ±  0%     833.2Ki ±  0%       ~ (p=0.193 n=6)
PipeJoins/crossJoin/n=1000-4     8.132Mi ±  0%     8.132Mi ±  0%       ~ (p=0.589 n=6)
PipeJoins/crossJoin/n=10000-4    81.31Mi ±  0%     81.31Mi ±  0%       ~ (p=0.937 n=6)
PipeSetOps/except/n=100-4        77.62Ki ±  0%     77.62Ki ±  0%       ~ (p=0.513 n=6)
PipeSetOps/except/n=1000-4       765.3Ki ±  0%     765.3Ki ±  0%       ~ (p=0.175 n=6)
PipeSetOps/except/n=10000-4      7.628Mi ±  0%     7.628Mi ±  0%       ~ (p=0.472 n=6)
PipeSetOps/intersect/n=100-4     81.80Ki ±  0%     81.80Ki ±  0%       ~ (p=0.729 n=6)
PipeSetOps/intersect/n=1000-4    798.3Ki ±  0%     798.4Ki ±  0%       ~ (p=0.097 n=6)
PipeSetOps/intersect/n=10000-4   8.106Mi ±  0%     8.106Mi ±  0%       ~ (p=0.898 n=6)
geomean                                        ²                  +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                               │  /tmp/old.txt  │             /tmp/new.txt             │
                               │   allocs/op    │  allocs/op    vs base                │
Pipe/filter/n=100-4               201.0 ±  0%      201.0 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/filter/n=1000-4             2.001k ±  0%     2.001k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/filter/n=10000-4            20.00k ±  0%     20.00k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/groupBy/n=100-4              0.000 ±  0%      0.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/groupBy/n=1000-4             0.000 ±  0%      0.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/groupBy/n=10000-4            0.000 ±  0%      0.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/aggregate/n=100-4            230.0 ±  0%      230.0 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/aggregate/n=1000-4          1.190k ±  0%     1.190k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/aggregate/n=10000-4         10.27k ±  0%     10.27k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/sort/n=100-4                 2.000 ±  0%      2.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/sort/n=1000-4                2.000 ±  0%      2.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/sort/n=10000-4               2.000 ±  0%      2.000 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/distinct/n=100-4             104.0 ±  0%      104.0 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/distinct/n=1000-4           1.006k ±  0%     1.006k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/distinct/n=10000-4          10.03k ±  0%     10.03k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/dedupe/n=100-4               104.0 ±  0%      104.0 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/dedupe/n=1000-4             1.006k ±  0%     1.006k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/dedupe/n=10000-4            10.03k ±  0%     10.03k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/window/n=100-4               231.0 ±  0%      231.0 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/window/n=1000-4             1.191k ±  0%     1.191k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/window/n=10000-4            15.15k ± 15%     15.15k ± 14%       ~ (p=1.000 n=6)
Pipe/topPerGroup/n=100-4          230.0 ±  0%      230.0 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/topPerGroup/n=1000-4        1.190k ±  0%     1.190k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/topPerGroup/n=10000-4       10.25k ±  0%     10.25k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/histogram/n=100-4            42.00 ±  0%      42.00 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/histogram/n=1000-4           42.00 ±  0%      42.00 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/histogram/n=10000-4          52.00 ±  0%      52.00 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/pivot/n=100-4                612.0 ±  0%      612.0 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/pivot/n=1000-4              4.272k ±  0%     4.272k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/pivot/n=10000-4             40.33k ±  0%     40.33k ±  0%       ~ (p=0.545 n=6)
Pipe/unpivot/n=100-4              301.0 ±  0%      301.0 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/unpivot/n=1000-4            3.001k ±  0%     3.001k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/unpivot/n=10000-4           30.00k ±  0%     30.00k ±  0%       ~ (p=1.000 n=6) ¹
Pipe/gapfill/n=100-4              11.00 ±  0%      11.00 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/gapfill/n=1000-4             15.00 ±  0%      15.00 ±  0%       ~ (p=1.000 n=6) ¹
Pipe/gapfill/n=10000-4            22.00 ±  0%      22.00 ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/lookup/n=100-4         2.310k ±  0%     2.310k ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/lookup/n=1000-4        14.01k ±  0%     14.01k ±  0%       ~ (p=0.455 n=6)
PipeJoins/lookup/n=10000-4       131.0k ±  0%     131.0k ±  0%       ~ (p=0.455 n=6)
PipeJoins/asofJoin/n=100-4       1.217k ±  0%     1.217k ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/asofJoin/n=1000-4      12.02k ±  0%     12.02k ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/asofJoin/n=10000-4     120.0k ±  0%     120.0k ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/crossJoin/n=100-4      12.00k ±  0%     12.00k ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/crossJoin/n=1000-4     120.0k ±  0%     120.0k ±  0%       ~ (p=1.000 n=6) ¹
PipeJoins/crossJoin/n=10000-4    1.200M ±  0%     1.200M ±  0%       ~ (p=1.000 n=6)
PipeSetOps/except/n=100-4         968.0 ±  0%      968.0 ±  0%       ~ (p=1.000 n=6) ¹
PipeSetOps/except/n=1000-4       9.609k ±  0%     9.609k ±  0%       ~ (p=1.000 n=6) ¹
PipeSetOps/except/n=10000-4      96.04k ±  0%     96.04k ±  0%       ~ (p=1.000 n=6)
PipeSetOps/intersect/n=100-4     1.054k ±  0%     1.054k ±  0%       ~ (p=1.000 n=6) ¹
PipeSetOps/intersect/n=1000-4    10.41k ±  0%     10.41k ±  0%       ~ (p=1.000 n=6) ¹
PipeSetOps/intersect/n=10000-4   104.1k ±  0%     104.1k ±  0%       ~ (p=1.000 n=6)
geomean                                       ²                 +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/xraph/dql/planner
                │ /tmp/old.txt │           /tmp/new.txt            │
                │    sec/op    │   sec/op     vs base              │
Plan/pushdown-4    843.7n ± 2%   847.4n ± 2%       ~ (p=0.240 n=6)
Plan/inmemory-4    770.7n ± 2%   770.7n ± 1%       ~ (p=0.699 n=6)
Plan/groupBy-4     719.9n ± 1%   724.7n ± 2%       ~ (p=0.132 n=6)
geomean            776.5n        779.3n       +0.37%

                │ /tmp/old.txt │             /tmp/new.txt             │
                │     B/op     │     B/op      vs base                │
Plan/pushdown-4   1.594Ki ± 0%   1.594Ki ± 0%       ~ (p=1.000 n=6) ¹
Plan/inmemory-4   1.562Ki ± 0%   1.562Ki ± 0%       ~ (p=1.000 n=6) ¹
Plan/groupBy-4    1.016Ki ± 0%   1.016Ki ± 0%       ~ (p=1.000 n=6) ¹
geomean           1.362Ki        1.362Ki       +0.00%
¹ all samples are equal

                │ /tmp/old.txt │            /tmp/new.txt            │
                │  allocs/op   │ allocs/op   vs base                │
Plan/pushdown-4     9.000 ± 0%   9.000 ± 0%       ~ (p=1.000 n=6) ¹
Plan/inmemory-4     9.000 ± 0%   9.000 ± 0%       ~ (p=1.000 n=6) ¹
Plan/groupBy-4      8.000 ± 0%   8.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean             8.653        8.653       +0.00%
¹ all samples are equal

pkg: github.com/xraph/dql/processor
                              │ /tmp/old.txt │            /tmp/new.txt            │
                              │    sec/op    │    sec/op     vs base              │
Process/passthrough/n=100-4     81.65n ±  3%   78.20n ±  1%  -4.21% (p=0.002 n=6)
Process/passthrough/n=1000-4    97.74n ±  1%   95.98n ±  2%  -1.80% (p=0.026 n=6)
Process/passthrough/n=10000-4   94.33n ±  2%   94.18n ±  2%       ~ (p=0.699 n=6)
Process/aggregate/n=100-4       22.05µ ±  1%   22.12µ ±  5%       ~ (p=0.699 n=6)
Process/aggregate/n=1000-4      153.2µ ± 11%   155.5µ ± 22%  +1.49% (p=0.028 n=6)
Process/aggregate/n=10000-4     1.461m ±  3%   1.462m ±  4%       ~ (p=1.000 n=6)
Process/sort/n=100-4            5.166µ ±  1%   5.169µ ±  0%       ~ (p=0.937 n=6)
Process/sort/n=1000-4           52.54µ ±  7%   53.54µ ±  1%       ~ (p=0.065 n=6)
Process/sort/n=10000-4          743.8µ ±  2%   752.2µ ±  0%       ~ (p=0.240 n=6)
Process/computed/n=100-4        3.696µ ±  2%   3.624µ ±  1%  -1.96% (p=0.002 n=6)
Process/computed/n=1000-4       40.81µ ±  1%   40.98µ ±  0%  +0.41% (p=0.041 n=6)
Process/computed/n=10000-4      405.9µ ±  1%   409.3µ ±  0%  +0.84% (p=0.002 n=6)
geomean                         13.76µ         13.73µ        -0.17%

                              │ /tmp/old.txt │            /tmp/new.txt            │
                              │    rows/s    │    rows/s     vs base              │
Process/passthrough/n=100-4     1.225G ±  3%   1.279G ±  1%  +4.39% (p=0.002 n=6)
Process/passthrough/n=1000-4    10.23G ±  1%   10.42G ±  2%  +1.83% (p=0.026 n=6)
Process/passthrough/n=10000-4   106.0G ±  2%   106.2G ±  2%       ~ (p=0.699 n=6)
Process/aggregate/n=100-4       4.536M ±  1%   4.521M ±  4%       ~ (p=0.699 n=6)
Process/aggregate/n=1000-4      6.527M ± 10%   6.431M ± 18%  -1.47% (p=0.026 n=6)
Process/aggregate/n=10000-4     6.844M ±  2%   6.840M ±  4%       ~ (p=1.000 n=6)
Process/sort/n=100-4            19.36M ±  1%   19.35M ±  0%       ~ (p=0.937 n=6)
Process/sort/n=1000-4           19.03M ±  6%   18.68M ±  1%       ~ (p=0.065 n=6)
Process/sort/n=10000-4          13.45M ±  2%   13.29M ±  0%       ~ (p=0.240 n=6)
Process/computed/n=100-4        27.06M ±  2%   27.60M ±  1%  +1.99% (p=0.002 n=6)
Process/computed/n=1000-4       24.50M ±  1%   24.40M ±  0%  -0.41% (p=0.041 n=6)
Process/computed/n=10000-4      24.64M ±  1%   24.43M ±  0%  -0.83% (p=0.002 n=6)
geomean                         72.70M         72.82M        +0.17%

                              │ /tmp/old.txt │             /tmp/new.txt             │
                              │     B/op     │     B/op      vs base                │
Process/passthrough/n=100-4       168.0 ± 0%     168.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/passthrough/n=1000-4      168.0 ± 0%     168.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/passthrough/n=10000-4     168.0 ± 0%     168.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/aggregate/n=100-4       13.24Ki ± 0%   13.24Ki ± 0%       ~ (p=1.000 n=6) ¹
Process/aggregate/n=1000-4      37.78Ki ± 0%   37.77Ki ± 0%       ~ (p=0.892 n=6)
Process/aggregate/n=10000-4     270.6Ki ± 0%   270.6Ki ± 0%       ~ (p=0.675 n=6)
Process/sort/n=100-4              224.0 ± 0%     224.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/sort/n=1000-4             224.0 ± 0%     224.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/sort/n=10000-4            224.0 ± 0%     224.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/computed/n=100-4          168.0 ± 0%     168.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/computed/n=1000-4         168.0 ± 0%     168.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/computed/n=10000-4        168.0 ± 0%     168.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                           759.3          759.3       -0.00%
¹ all samples are equal

                              │ /tmp/old.txt │            /tmp/new.txt             │
                              │  allocs/op   │  allocs/op   vs base                │
Process/passthrough/n=100-4       2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
Process/passthrough/n=1000-4      2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
Process/passthrough/n=10000-4     2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
Process/aggregate/n=100-4         252.0 ± 0%    252.0 ± 0%       ~ (p=1.000 n=6) ¹
Process/aggregate/n=1000-4       1.212k ± 0%   1.212k ± 0%       ~ (p=1.000 n=6) ¹
Process/aggregate/n=10000-4      10.27k ± 0%   10.27k ± 0%       ~ (p=1.000 n=6) ¹
Process/sort/n=100-4              4.000 ± 0%    4.000 ± 0%       ~ (p=1.000 n=6) ¹
Process/sort/n=1000-4             4.000 ± 0%    4.000 ± 0%       ~ (p=1.000 n=6) ¹
Process/sort/n=10000-4            4.000 ± 0%    4.000 ± 0%       ~ (p=1.000 n=6) ¹
Process/computed/n=100-4          2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
Process/computed/n=1000-4         2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
Process/computed/n=10000-4        2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                           12.37         12.37       +0.00%
¹ all samples are equal

pkg: github.com/xraph/dql/sqlgen
                       │ /tmp/old.txt │           /tmp/new.txt            │
                       │    sec/op    │   sec/op     vs base              │
GenerateSQL/simple-4      715.7n ± 3%   721.1n ± 1%       ~ (p=0.485 n=6)
GenerateSQL/compound-4    1.020µ ± 1%   1.026µ ± 1%       ~ (p=0.084 n=6)
geomean                   854.4n        859.9n       +0.65%

                       │ /tmp/old.txt │            /tmp/new.txt            │
                       │     B/op     │    B/op     vs base                │
GenerateSQL/simple-4       520.0 ± 0%   520.0 ± 0%       ~ (p=1.000 n=6) ¹
GenerateSQL/compound-4     536.0 ± 0%   536.0 ± 0%       ~ (p=1.000 n=6) ¹
geomean                    527.9        527.9       +0.00%
¹ all samples are equal

                       │ /tmp/old.txt │            /tmp/new.txt            │
                       │  allocs/op   │ allocs/op   vs base                │
GenerateSQL/simple-4       13.00 ± 0%   13.00 ± 0%       ~ (p=1.000 n=6) ¹
GenerateSQL/compound-4     16.00 ± 0%   16.00 ± 0%       ~ (p=1.000 n=6) ¹
geomean                    14.42        14.42       +0.00%
¹ all samples are equal

juicycleff added a commit that referenced this pull request Aug 3, 2026
Verification on pull request #1 flagged Pipe/sort/n=1000 at +20.06% on a change
that never touched sort. Same-runner comparison holds most benchmarks to
+/-1-3%, but the tail reaches 20, so a 20% gate cries wolf.

The deliberate regression in that same run measured +117% to +188%, so 30 costs
no detection power. Also records the measured gate runtime of 2m48s, well under
the estimate — -benchtime bounds each benchmark by wall clock, so total time
tracks benchmark count rather than machine speed.
@juicycleff

Copy link
Copy Markdown
Contributor Author

Verification complete — the gate works as intended.

It correctly failed on the deliberate regression (+117% to +188%, p=0.002) and the whole run took 2m48s.

It also surfaced one false positive: Pipe/sort/n=1000 at +20.06% on a change that never touched sort. Threshold raised 20% → 30% in 697b587 as a result, and the findings are recorded in the design spec.

Closing without merging — this branch only ever existed to make the gate fire.

@juicycleff juicycleff closed this Aug 3, 2026
@juicycleff
juicycleff deleted the test/bench-gate-verification branch August 3, 2026 23:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant