7575 run : |
7676 python3 << 'EOF'
7777 import json
78- import sys
79- import os
8078
81- THRESHOLD = 40.0 # 40% regression threshold
82- MIN_REGRESSIONS = 5 # Minimum number of regressions to fail
79+ REGRESSION_THRESHOLD = 40.0 # Threshold for flagging significant regressions
80+ IMPROVEMENT_THRESHOLD = 20.0 # Threshold for flagging improvements
8381
8482 def parse_benchmarks(file_path):
8583 """Parse concatenated BenchmarkDotNet JSON files."""
@@ -132,14 +130,14 @@ jobs:
132130 'change': change_pct
133131 })
134132
135- if change_pct > THRESHOLD :
133+ if change_pct > REGRESSION_THRESHOLD :
136134 regressions.append({
137135 'name': name,
138136 'baseline': baseline_mean,
139137 'current': current_mean,
140138 'change': change_pct
141139 })
142- elif change_pct < -THRESHOLD :
140+ elif change_pct < -IMPROVEMENT_THRESHOLD :
143141 improvements.append({
144142 'name': name,
145143 'change': change_pct
@@ -151,28 +149,18 @@ jobs:
151149
152150 # Generate summary
153151 print(f"\nCompared {len(results)} benchmarks")
154- print(f"Regressions (>{THRESHOLD }%): {len(regressions)}")
155- print(f"Improvements (<-{THRESHOLD }%): {len(improvements)}")
152+ print(f"Significant regressions (>{REGRESSION_THRESHOLD }%): {len(regressions)}")
153+ print(f"Improvements (<-{IMPROVEMENT_THRESHOLD }%): {len(improvements)}")
156154
157155 if regressions:
158- print(f"\nPerformance regressions detected :")
156+ print(f"\nBenchmarks with significant regression :")
159157 for r in sorted(regressions, key=lambda x: -x['change']):
160- print(f" - {r['name']}: +{r['change']:.1f}% slower ({r['baseline']:.2f}ns -> {r['current']:.2f}ns)")
161-
162- # Only fail if we have at least MIN_REGRESSIONS benchmarks regressing
163- if len(regressions) >= MIN_REGRESSIONS:
164- print(f"\n::error::{len(regressions)} benchmarks regressed >{THRESHOLD}% (threshold: {MIN_REGRESSIONS})")
165- with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
166- f.write("has_regressions=true\n")
167- f.write(f"regression_count={len(regressions)}\n")
168- sys.exit(1)
169- else:
170- if regressions:
171- print(f"\n{len(regressions)} regression(s) detected but below threshold of {MIN_REGRESSIONS} required to fail.")
172- else:
173- print("\nNo significant performance regressions detected.")
174- with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
175- f.write("has_regressions=false\n")
158+ print(f" - {r['name']}: +{r['change']:.1f}% ({r['baseline']:.2f}ns -> {r['current']:.2f}ns)")
159+
160+ if improvements:
161+ print(f"\nBenchmarks with significant improvement:")
162+ for r in sorted(improvements, key=lambda x: x['change']):
163+ print(f" - {r['name']}: {r['change']:.1f}%")
176164 EOF
177165
178166 - name : Comment PR with benchmark results
@@ -194,24 +182,19 @@ jobs:
194182 const warnings = results.filter(r => r.change > 20 && r.change <= 40);
195183 const improvements = results.filter(r => r.change < -20);
196184
197- if (regressions.length >= 5) {
198- body += `:x: **${regressions.length} benchmarks regressed >40% (PR blocked)**\n\n`;
199- } else if (regressions.length > 0) {
200- body += `:warning: **${regressions.length} benchmark(s) regressed >40% (below threshold of 5 to block)**\n\n`;
201- } else {
202- body += ':white_check_mark: **No significant performance regressions detected**\n\n';
203- }
204-
205185 if (regressions.length > 0) {
186+ body += `:warning: **${regressions.length} benchmark(s) showed significant regression (>40%)**\n\n`;
206187 body += '| Benchmark | Baseline | Current | Change |\n';
207188 body += '|-----------|----------|---------|--------|\n';
208189 for (const r of regressions.slice(0, 10)) {
209190 const shortName = r.name.split('.').slice(-2).join('.');
210- body += `| ${shortName} | ${r.baseline.toFixed(2)}ns | ${r.current.toFixed(2)}ns | :x : +${r.change.toFixed(1)}% |\n`;
191+ body += `| ${shortName} | ${r.baseline.toFixed(2)}ns | ${r.current.toFixed(2)}ns | :warning : +${r.change.toFixed(1)}% |\n`;
211192 }
212193 if (regressions.length > 10) {
213- body += `\n*...and ${regressions.length - 10} more regressions *\n`;
194+ body += `\n*...and ${regressions.length - 10} more*\n`;
214195 }
196+ } else {
197+ body += ':white_check_mark: **No significant performance regressions detected**\n\n';
215198 }
216199
217200 if (warnings.length > 0) {
@@ -275,9 +258,3 @@ jobs:
275258 pr-results/
276259 src/LightningDB.Benchmarks/BenchmarkDotNet.Artifacts/results/
277260 retention-days : 14
278-
279- - name : Fail if regressions detected
280- if : steps.compare.outputs.has_regressions == 'true'
281- run : |
282- echo "::error::PR blocked: 5+ benchmarks regressed more than 40%"
283- exit 1
0 commit comments