Skip to content

Commit d7a4123

Browse files
committed
improve comparison for more than one environ
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 1a13de7 commit d7a4123

2 files changed

Lines changed: 66 additions & 9 deletions

File tree

codespeed/static/js/comparison.js

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,19 @@ function updateBaselineDropdown() {
106106
var $baseline = $("#baseline");
107107
var current = $baseline.val();
108108
$baseline.find("option:not([value='none'])").remove();
109+
var enviros = readCheckbox("input[name='environments']:checked").split(",").filter(Boolean);
110+
var multiEnv = enviros.length > 1;
109111
$("input[name='executables']:checked").each(function() {
110112
var key = $(this).val();
111113
var name = $(this).next('label').text().trim();
112-
$baseline.append($('<option>').val(key).text(name));
114+
if (multiEnv) {
115+
enviros.forEach(function(envId) {
116+
var envName = $("label[for='env_" + envId + "']").text().trim();
117+
$baseline.append($('<option>').val(key + ':' + envId).text(name + ' @ ' + envName));
118+
});
119+
} else {
120+
$baseline.append($('<option>').val(key).text(name));
121+
}
113122
});
114123
if ($baseline.find("option[value='" + current + "']").length) {
115124
$baseline.val(current);
@@ -135,7 +144,21 @@ function loadData() {
135144
}
136145

137146
function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline, chart, horizontal) {
138-
var baselineLabel = baseline !== "none" ? $("label[for='exe_" + baseline + "']").text().trim() : "";
147+
// baseline may be "exe_key" or "exe_key:env_id" (for cross-env normalization)
148+
var baselineExe = baseline, baselineEnv = null;
149+
if (baseline !== "none" && baseline.indexOf(':') !== -1) {
150+
var bparts = baseline.split(':');
151+
baselineExe = bparts[0];
152+
baselineEnv = bparts[1];
153+
}
154+
155+
var baselineLabel = "";
156+
if (baseline !== "none") {
157+
baselineLabel = $("label[for='exe_" + baselineExe + "']").text().trim();
158+
if (baselineEnv !== null) {
159+
baselineLabel += ' @ ' + $("label[for='env_" + baselineEnv + "']").text().trim();
160+
}
161+
}
139162

140163
var title;
141164
if (baseline === "none") {
@@ -164,15 +187,17 @@ function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline,
164187
for (var i = 0; i < exes.length; i++) {
165188
for (var j = 0; j < enviros.length; j++) {
166189
var exeLabel = $("label[for='exe_" + exes[i] + "']").text().trim();
167-
if (chart === "relative bars" && exes[i] === baseline) { continue; }
190+
if (chart === "relative bars" && exes[i] === baselineExe &&
191+
(baselineEnv === null || baselineEnv === enviros[j])) { continue; }
168192
var data = [];
169193
for (var b = 0; b < benchmarks.length; b++) {
170194
var val = compdata[exes[i]] && compdata[exes[i]][enviros[j]]
171195
? compdata[exes[i]][enviros[j]][benchmarks[b]]
172196
: null;
173197
if (val !== null && baseline !== "none") {
174-
var baseval = compdata[baseline] && compdata[baseline][enviros[j]]
175-
? compdata[baseline][enviros[j]][benchmarks[b]]
198+
var envForBase = baselineEnv !== null ? baselineEnv : enviros[j];
199+
var baseval = compdata[baselineExe] && compdata[baselineExe][envForBase]
200+
? compdata[baselineExe][envForBase][benchmarks[b]]
176201
: null;
177202
val = (baseval === null || baseval === 0) ? null : val / baseval;
178203
}
@@ -205,8 +230,9 @@ function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline,
205230
? compdata[exes[i]][enviros[j]][benchmarks[b]]
206231
: null;
207232
if (val !== null && baseline !== "none") {
208-
var baseval = compdata[baseline] && compdata[baseline][enviros[j]]
209-
? compdata[baseline][enviros[j]][benchmarks[b]]
233+
var envForBase = baselineEnv !== null ? baselineEnv : enviros[j];
234+
var baseval = compdata[baselineExe] && compdata[baselineExe][envForBase]
235+
? compdata[baselineExe][envForBase][benchmarks[b]]
210236
: null;
211237
val = (baseval === null || baseval === 0) ? null : val / baseval;
212238
}
@@ -220,6 +246,11 @@ function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline,
220246

221247
if (datasets.length === 0) { return; }
222248

249+
// Mark datasets where all values are null (baseline has no data for that env)
250+
datasets.forEach(function(ds) {
251+
ds.allNull = ds.data.every(function(v) { return v === null; });
252+
});
253+
223254
// Size the container
224255
var wrapWidth = $("#plotwrapper").width();
225256
var h = horizontal
@@ -263,7 +294,19 @@ function renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, baseline,
263294
font: {size: FONT_SIZE},
264295
boxWidth: 20,
265296
boxHeight: FONT_SIZE,
266-
padding: 8
297+
padding: 8,
298+
generateLabels: function(chart) {
299+
var items = Chart.defaults.plugins.legend.labels.generateLabels(chart);
300+
items.forEach(function(item) {
301+
var ds = chart.data.datasets[item.datasetIndex];
302+
if (ds && ds.allNull) {
303+
// Apply unicode combining strikethrough to each character
304+
item.text = item.text.split('').join('\u0336') + '\u0336';
305+
item.fontColor = '#aaa';
306+
}
307+
});
308+
return items;
309+
}
267310
}
268311
}
269312
},
@@ -314,7 +357,11 @@ function init(defaults) {
314357
$("#benchmark .checkall, #benchmark .uncheckall").click(loadData);
315358

316359
// Re-render without re-fetching for other controls
317-
$("#chart_type, #baseline, #direction, input[name='environments']").change(refreshContent);
360+
$("#chart_type, #baseline, #direction").change(refreshContent);
361+
$("input[name='environments']").change(function() {
362+
updateBaselineDropdown();
363+
refreshContent();
364+
});
318365

319366
$.ajaxSetup ({
320367
cache: false

codespeed/static/js/timeline.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,15 @@ function renderMiniplot(plotid, data) {
418418
built.data.forEach(function(row) { row.push([bv, bv, bv]); });
419419
}
420420

421+
var miniWindow = null;
422+
if (built.data.length === 1) {
423+
var mx = built.data[0][0];
424+
var mxv = (mx instanceof Date) ? mx.getTime() : mx;
425+
miniWindow = (mx instanceof Date)
426+
? [new Date(mxv - 86400000), new Date(mxv + 86400000)]
427+
: [mxv - 1, mxv + 1];
428+
}
429+
421430
var g = new Dygraph(
422431
document.getElementById(plotid),
423432
built.data,
@@ -433,6 +442,7 @@ function renderMiniplot(plotid, data) {
433442
y: { drawAxis: false, drawGrid: false, valueRange: [0, null] }
434443
},
435444
xRangePad: 20,
445+
dateWindow: miniWindow,
436446
connectSeparatedPoints: true,
437447
highlightCircleSize: 0
438448
}

0 commit comments

Comments
 (0)