Skip to content

Commit 96d5359

Browse files
committed
Mimic existing design
1 parent 6e65aa2 commit 96d5359

File tree

2 files changed

+127
-60
lines changed

2 files changed

+127
-60
lines changed

site/src/comparison.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,9 @@ pub struct BenchmarkVariances {
473473
}
474474

475475
impl BenchmarkVariances {
476+
const NUM_PREVIOUS_COMMITS: usize = 100;
477+
const MIN_PREVIOUS_COMMITS: usize = 50;
478+
476479
async fn calculate(
477480
ctxt: &SiteCtxt,
478481
from: ArtifactId,
@@ -486,11 +489,11 @@ impl BenchmarkVariances {
486489
.set::<String>(Tag::Profile, selector::Selector::All)
487490
.set(Tag::ProcessStatistic, selector::Selector::One(stat));
488491

489-
let num_commits = 100;
490-
let previous_commits = Arc::new(previous_commits(from, num_commits, master_commits));
491-
if previous_commits.len() < num_commits {
492-
return Ok(None);
493-
}
492+
let previous_commits = Arc::new(previous_commits(
493+
from,
494+
Self::NUM_PREVIOUS_COMMITS,
495+
master_commits,
496+
));
494497
let mut previous_commit_series = ctxt
495498
.query::<Option<f64>>(query, previous_commits.clone())
496499
.await?;
@@ -507,6 +510,9 @@ impl BenchmarkVariances {
507510
}
508511
}
509512
}
513+
if variance_data.len() < Self::MIN_PREVIOUS_COMMITS {
514+
return Ok(None);
515+
}
510516

511517
for (bench, results) in variance_data.iter_mut() {
512518
debug!("Calculating variance for: {}", bench);

site/static/compare.html

Lines changed: 116 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -238,59 +238,74 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
238238
</div>
239239
</fieldset>
240240
<div id="content" style="margin-top: 15px">
241-
<div v-if="data">
242-
<div v-if="notContinuous">Warning: The start and end are not adjacent!</div>
243-
<a v-bind:href="compareLink">compare</a>
244-
<a v-if="data.prev" v-bind:href="prevLink">&larr;</a>
245-
<div>
246-
<span>{{data.a.date}}</span>
247-
<span>({{short(data.a)}})</span>
248-
</div>
249-
<div>
250-
<span>{{data.b.date}}</span>
251-
<span>({{short(data.b)}})</span>
252-
</div>
253-
<a v-if="data.next" v-bind:href="nextLink">&rarr;</a>
254-
<a v-if="data.a.pr" v-bind:href="prLink(data.a.pr)">#{{data.a.pr}}</a>
255-
<a v-if="data.b.pr" v-bind:href="prLink(data.b.pr)">#{{data.b.pr}}</a>
256-
<table class="compare" style="font-size: medium !important;">
257-
<tbody>
258-
<template v-for="bench in benches">
259-
<tr data-field-start="true">
260-
<th style="width: 19em;">
261-
<details class="toggle-table" v-on:toggle="benchGroupToggle">
262-
<summary>{{ bench.name }}</summary>
263-
</details>
264-
</th>
265-
<td>avg: <span>??</span></td>
266-
<td>min: <span>??</span></td>
267-
<td>max: <span>??</span></td>
241+
<table v-if="data" class="compare" style="font-size: medium !important;">
242+
<thead>
243+
<tr>
244+
<td v-if="notContinuous" colspan="4" style="text-align:center;"><b>Warning</b>: The start and end
245+
are not adjacent!</td>
246+
</tr>
247+
<tr>
248+
<th>
249+
<a v-bind:href="compareLink">compare</a>
250+
</th>
251+
<th>
252+
<a v-if="data.prev" v-bind:href="prevLink">&larr;</a>
253+
{{formatDate(data.a.date)}}
254+
(<a>{{short(data.a)}}</a>)
255+
</th>
256+
<th>
257+
{{formatDate(data.b.date)}}
258+
(<a>{{short(data.b)}}</a>)
259+
<a v-if="data.next" v-bind:href="nextLink">&rarr;</a>
260+
</th>
261+
<th>% change</th>
262+
</tr>
263+
<tr>
264+
<th></th>
265+
<th style="text-align: left;"><a v-if="data.a.pr" v-bind:href="prLink(data.a.pr)">#{{data.a.pr}}</a>
266+
</th>
267+
<th style="text-align: left;"><a v-if="data.b.pr" v-bind:href="prLink(data.b.pr)">#{{data.b.pr}}</a>
268+
</th>
269+
</tr>
270+
</thead>
271+
<tbody>
272+
<template v-for="bench in benches">
273+
<tr data-field-start="true">
274+
<th>
275+
<details class="toggle-table" v-on:toggle="benchGroupToggle">
276+
<summary>{{ trimBenchName(bench.name) }}</summary>
277+
</details>
278+
</th>
279+
<td>avg: <span v-bind:class="percentClass(bench.avg_pct)">{{bench.avg_pct}}</span></td>
280+
<td>min: <span v-bind:class="percentClass(bench.min_pct)">{{bench.min_pct}}</span></td>
281+
<td>max: <span
282+
v-bind:class="percentClass(bench.max_pct)">{{bench.max_pct}}%{{isDodgyBench(bench)
283+
? "?" : ""}}</span></td>
284+
</tr>
285+
<template v-for="run in bench.fields">
286+
<tr>
287+
<td>{{ run.casename }}</td>
288+
<td>
289+
<a v-bind:href="detailedQueryLink(data.a.commit, bench.name, run.casename)">
290+
{{ run.datum_a }}
291+
</a>
292+
</td>
293+
<td>
294+
<a v-bind:href="detailedQueryLink(data.b.commit, bench.name, run.casename)">
295+
{{ run.datum_b }}
296+
</a>
297+
</td>
298+
<td>
299+
<a v-bind:href="percentLink(data.b.commit, data.a.commit, bench.name, run.casename)">
300+
<span v-bind:class="percentClass(run.percent)">{{ run.percent }}%{{run.isDodgy ? "?"
301+
: ""}}</span>
302+
</a>
303+
</td>
268304
</tr>
269-
<template v-for="run in bench.fields">
270-
<tr>
271-
<td>{{ run.casename }}</td>
272-
<td>
273-
<a v-bind:href="detailedQueryLink(data.a.commit, bench.name, run.casename)">
274-
{{ run.datum_a }}
275-
</a>
276-
</td>
277-
<td>
278-
<a v-bind:href="detailedQueryLink(data.b.commit, bench.name, run.casename)">
279-
{{ run.datum_b }}
280-
</a>
281-
</td>
282-
<td>
283-
<a v-bind:class="percentClass(run.percent)"
284-
v-bind:href="percentLink(data.b.commit, data.a.commit, bench.name, run.casename)">
285-
{{ run.percent }}%
286-
</a>
287-
</td>
288-
</tr>
289-
</template>
290305
</template>
291-
</tbody>
292-
</table>
293-
</div>
306+
</template>
307+
</tbody>
308+
</table>
294309
</div>
295310
<br>
296311
<div id="as-of"></div>
@@ -324,7 +339,6 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
324339
benches: function () {
325340
let data = this.data;
326341

327-
328342
function shouldShowBuild(name) {
329343
if (name == "full") {
330344
return document.querySelector("#build-full").checked;
@@ -383,18 +397,26 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
383397
} else {
384398
// should be unreachable
385399
}
400+
401+
let isDodgy = false;
402+
if (data.variance) {
403+
let variance = data.variance[name + "-" + key];
404+
isDodgy = !!(variance && variance.description && variance.description.type != "Normal");
405+
}
386406
if (shouldShowBuild(key)) {
387407
fields.push({
388408
casename: key,
389409
datum_a,
390410
datum_b,
391411
percent: percent_chg(datum_a, datum_b).toFixed(1),
412+
isDodgy,
392413
});
393414
}
394415
}
395416

396417
return fields;
397418
}
419+
398420
let test_names = unique([
399421
...Object.keys(data.a.data),
400422
...Object.keys(data.b.data),
@@ -410,6 +432,32 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
410432
// .map(name => ({ name, is_bootstrap: true, fields: to_fields_bootstrap(name) })),
411433
...test_names.map(name => { return { name, fields: to_fields(name) } })
412434
];
435+
436+
for (let field of fields) {
437+
let pcts = field.fields.map(field => parseFloat(field.percent))
438+
.filter(p => p != undefined && p != null);
439+
field.max_pct = Math.max(...pcts).toFixed(1);
440+
field.min_pct = Math.min(...pcts).toFixed(1);
441+
field.farthest_pct = Math.max(...pcts.map(p => Math.abs(p)));
442+
let sum = pcts.reduce((a, b) => a + b, 0);
443+
let avg = sum / pcts.length;
444+
field.avg_pct = avg.toFixed(1);
445+
field.max_casename_len = Math.max(...field.fields.map(f => f.casename.length));
446+
}
447+
448+
fields.sort((a, b) => {
449+
if (a.is_bootstrap == b.is_bootstrap) {
450+
return b.farthest_pct - a.farthest_pct;
451+
}
452+
else {
453+
if (a.is_bootstrap) {
454+
return 1;
455+
}
456+
else {
457+
return -1;
458+
}
459+
}
460+
});
413461
return fields;
414462
}
415463
},
@@ -442,9 +490,22 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
442490
},
443491
benchGroupToggle(e) {
444492
const element = e.target;
445-
toggleBenchGroup(element)
446-
}
493+
toggleBenchGroup(element);
494+
},
495+
formatDate(date) {
496+
return print_date(new Date(date));
497+
},
498+
trimBenchName(name) {
499+
let result = name.substring(0, 25)
500+
if (result != name) {
501+
result = result + "...";
447502

503+
}
504+
return result;
505+
},
506+
isDodgyBench(bench) {
507+
return bench.fields.some(f => f.isDodgy);
508+
}
448509
},
449510
watch: {
450511
data: function (newVal, oldVal) {
@@ -497,7 +558,7 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
497558
return (i < 10) ? "0" + i : "" + i;
498559
}
499560

500-
return `${date.getUTCFullYear()} -${pad_str(date.getUTCMonth() + 1)} -${pad_str(date.getUTCDate())} `;
561+
return `${date.getUTCFullYear()}-${pad_str(date.getUTCMonth() + 1)}-${pad_str(date.getUTCDate())} `;
501562
}
502563

503564
function unique(arr) {

0 commit comments

Comments
 (0)