Skip to content

Commit c3060d2

Browse files
authored
Merge pull request #74 from mattip/simulate-2
Fix simulate graph title
2 parents 1f7dec2 + 05a1619 commit c3060d2

2 files changed

Lines changed: 95 additions & 64 deletions

File tree

codespeed/static/js/comparison.js

Lines changed: 94 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
var Comparison = (function(window){
23

34
// Localize globals
@@ -17,7 +18,9 @@ var COLORS = [
1718
function getColor(i) { return COLORS[i % COLORS.length]; }
1819

1920
function getExeLabel(key) {
20-
return $("label[for='exe_" + key.replace(/:/g, '\\:') + "']").text().trim();
21+
return $("input[name='executables']")
22+
.filter(function() { return $(this).val() === key; })
23+
.next('label').text().trim();
2124
}
2225

2326
function getConfiguration() {
@@ -34,76 +37,103 @@ function getConfiguration() {
3437
function updateGraphTitle(exes, enviros, bens, baseline, chart, chartTitles) {
3538
var $title = $("#graph-title");
3639

37-
if (enviros.length === 1 && exes.length === 2 && baseline !== "none" &&
38-
chart !== "stacked bars" && compdata) {
40+
var isPair = (exes.length === 2 && enviros.length === 1) ||
41+
(exes.length === 1 && enviros.length === 2);
42+
if (isPair && chart !== "stacked bars" && compdata) {
43+
// Resolve which (exe, env) pair is "other" vs "base"
44+
var otherExe, otherEnv, baselineExe, baselineEnv;
3945

40-
var baselineExe = baseline, baselineEnv = null;
41-
if (baseline.indexOf('@') !== -1) {
42-
var bparts = baseline.split('@');
43-
baselineExe = bparts[0];
44-
baselineEnv = bparts[1];
46+
if (exes.length === 1 && enviros.length === 2) {
47+
// Same exe, two environments — only show geomean when an explicit baseline env is set
48+
if (baseline === "none") {
49+
$title.text(chartTitles.join(' / '));
50+
return;
51+
}
52+
otherExe = exes[0];
53+
baselineExe = exes[0];
54+
if (baseline.indexOf('@') !== -1) {
55+
var bparts = baseline.split('@');
56+
baselineEnv = bparts[1];
57+
otherEnv = enviros.filter(function(e) { return e !== baselineEnv; })[0] || enviros[1];
58+
} else {
59+
baselineEnv = enviros[0];
60+
otherEnv = enviros[1];
61+
}
62+
} else {
63+
// Two exes, one environment
64+
otherEnv = enviros[0];
65+
baselineEnv = null;
66+
if (baseline !== "none" && baseline.indexOf('@') !== -1) {
67+
var bparts = baseline.split('@');
68+
baselineExe = bparts[0];
69+
baselineEnv = bparts[1];
70+
} else if (baseline !== "none") {
71+
baselineExe = baseline;
72+
} else {
73+
baselineExe = exes[0];
74+
}
75+
otherExe = exes.filter(function(e) { return e !== baselineExe; })[0];
76+
if (!otherExe) { otherExe = exes[1]; }
4577
}
4678

47-
var otherExes = exes.filter(function(e) { return e !== baselineExe; });
48-
if (otherExes.length === 1) {
49-
var otherExe = otherExes[0];
50-
var envId = enviros[0];
51-
var envForBase = baselineEnv !== null ? baselineEnv : envId;
52-
53-
var product = 1, count = 0;
54-
for (var b = 0; b < bens.length; b++) {
55-
var val = compdata[otherExe] && compdata[otherExe][envId]
56-
? compdata[otherExe][envId][bens[b]]
57-
: null;
58-
var baseval = compdata[baselineExe] && compdata[baselineExe][envForBase]
59-
? compdata[baselineExe][envForBase][bens[b]]
60-
: null;
61-
if (val !== null && baseval !== null && baseval !== 0 && val > 0) {
62-
product *= val / baseval;
63-
count++;
64-
}
79+
var envForBase = baselineEnv !== null ? baselineEnv : otherEnv;
80+
81+
var product = 1, count = 0;
82+
for (var b = 0; b < bens.length; b++) {
83+
var val = compdata[otherExe] && compdata[otherExe][otherEnv]
84+
? compdata[otherExe][otherEnv][bens[b]]
85+
: null;
86+
var baseval = compdata[baselineExe] && compdata[baselineExe][envForBase]
87+
? compdata[baselineExe][envForBase][bens[b]]
88+
: null;
89+
if (val !== null && baseval !== null && baseval !== 0 && val > 0) {
90+
product *= val / baseval;
91+
count++;
6592
}
93+
}
6694

67-
if (count > 0) {
68-
var geomean = Math.pow(product, 1 / count);
69-
70-
var lessCount = 0, moreCount = 0;
71-
var benSet = {};
72-
for (var b = 0; b < bens.length; b++) { benSet[bens[b]] = true; }
73-
for (var u in bench_units) {
74-
var unitBens = bench_units[u][0];
75-
var unitLess = bench_units[u][1].indexOf("less") !== -1;
76-
for (var ub = 0; ub < unitBens.length; ub++) {
77-
if (benSet[unitBens[ub]]) {
78-
if (unitLess) { lessCount++; } else { moreCount++; }
79-
}
95+
if (count > 0) {
96+
var geomean = Math.pow(product, 1 / count);
97+
98+
var lessCount = 0, moreCount = 0;
99+
var benSet = {};
100+
for (var b = 0; b < bens.length; b++) { benSet[bens[b]] = true; }
101+
for (var u in bench_units) {
102+
var unitBens = bench_units[u][0];
103+
var unitLess = bench_units[u][1].indexOf("less") !== -1;
104+
for (var ub = 0; ub < unitBens.length; ub++) {
105+
if (benSet[unitBens[ub]]) {
106+
if (unitLess) { lessCount++; } else { moreCount++; }
80107
}
81108
}
109+
}
82110

83-
var otherLabel = getExeLabel(otherExe);
84-
var baselineLabel = getExeLabel(baselineExe);
85-
if (baselineEnv !== null) {
86-
baselineLabel += ' @ ' + $("label[for='env_" + baselineEnv + "']").text().trim();
87-
}
88-
89-
var suffix;
90-
if (moreCount === 0 && lessCount > 0) {
91-
suffix = geomean < 1
92-
? ' or <strong>' + (1 / geomean).toFixed(1) + '&times;</strong> faster'
93-
: ' or <strong>' + geomean.toFixed(1) + '&times;</strong> slower';
94-
} else if (lessCount === 0 && moreCount > 0) {
95-
suffix = geomean > 1
96-
? ' or <strong>' + geomean.toFixed(1) + '&times;</strong> faster'
97-
: ' or <strong>' + (1 / geomean).toFixed(1) + '&times;</strong> slower';
98-
} else {
99-
suffix = ' relative to baseline';
100-
}
111+
var otherLabel = getExeLabel(otherExe);
112+
var baselineLabel = getExeLabel(baselineExe);
113+
if (exes.length === 1) {
114+
otherLabel += ' @ ' + $("label[for='env_" + otherEnv + "']").text().trim();
115+
baselineLabel += ' @ ' + $("label[for='env_" + envForBase + "']").text().trim();
116+
} else if (baselineEnv !== null) {
117+
baselineLabel += ' @ ' + $("label[for='env_" + baselineEnv + "']").text().trim();
118+
}
101119

102-
$title.html('The geometric average of ' + count + ' benchmarks for <strong>' +
103-
otherLabel + '</strong> is <strong>' + geomean.toFixed(2) + '</strong>' +
104-
suffix + ' than the baseline <strong>' + baselineLabel + '</strong>');
105-
return;
120+
var suffix;
121+
if (moreCount === 0 && lessCount > 0) {
122+
suffix = geomean < 1
123+
? ' or <strong>' + (1 / geomean).toFixed(1) + '&times;</strong> faster'
124+
: ' or <strong>' + geomean.toFixed(1) + '&times;</strong> slower';
125+
} else if (lessCount === 0 && moreCount > 0) {
126+
suffix = geomean > 1
127+
? ' or <strong>' + geomean.toFixed(1) + '&times;</strong> faster'
128+
: ' or <strong>' + (1 / geomean).toFixed(1) + '&times;</strong> slower';
129+
} else {
130+
suffix = ' relative to baseline';
106131
}
132+
133+
$title.html('The geometric average of ' + count + ' benchmarks for <strong>' +
134+
otherLabel + '</strong> is <strong>' + geomean.toFixed(2) + '</strong>' +
135+
suffix + ' than the baseline <strong>' + baselineLabel + '</strong>');
136+
return;
107137
}
108138
}
109139

@@ -171,7 +201,8 @@ function refreshContent() {
171201
var plotid = "plot" + plotcounter;
172202
$("#plotwrapper").append('<div class="compplot-wrap"><canvas id="' + plotid + '"></canvas></div>');
173203
plotcounter++;
174-
chartTitles.push(renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, conf.bas, conf.chart, conf.hor));
204+
var t = renderComparisonPlot(plotid, unit, benchmarks, exes, enviros, conf.bas, conf.chart, conf.hor);
205+
chartTitles.push(t);
175206
}
176207
updateGraphTitle(exes, enviros, bens, conf.bas, conf.chart, chartTitles);
177208
});
@@ -207,7 +238,7 @@ function updateBaselineDropdown() {
207238
$baseline.append($('<option>').val(key).text(name));
208239
}
209240
});
210-
if ($baseline.find("option[value='" + current + "']").length) {
241+
if ($baseline.find("option").filter(function() { return $(this).val() === current; }).length) {
211242
$baseline.val(current);
212243
} else {
213244
$baseline.val('none');

codespeed/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ def comparison(request):
418418
proj = Project.objects.get(name=exe_spec['project'])
419419
exe = Executable.objects.get(name=exe_spec['name'], project=proj)
420420
for key in exekeys:
421-
if key.startswith(str(exe.id) + "+L+") and key in checkedexecutables:
421+
if key.startswith(str(exe.id) + ":L:") and key in checkedexecutables:
422422
selectedbaseline = key
423423
break
424424
except (Executable.DoesNotExist, Project.DoesNotExist):

0 commit comments

Comments
 (0)