@@ -250,10 +250,27 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
250
250
< span > {{data.b.date}}</ span >
251
251
< span > ({{short(data.b)}})</ span >
252
252
</ div >
253
+ < a v-if ="data.next " v-bind:href ="nextLink "> →</ 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
+ < div v-for ="bench in benches ">
257
+ < div >
258
+ < div >
259
+ {{ bench.name }} ({{bench.casename}})
260
+ </ div >
261
+ < a v-bind:href ="detailedQueryLink(data.a.commit, bench.name, bench.casename) ">
262
+ {{ bench.datum_a }}
263
+ </ a >
264
+ < a v-bind:href ="detailedQueryLink(data.b.commit, bench.name, bench.casename) ">
265
+ {{ bench.datum_b }}
266
+ </ a >
267
+ < a v-bind:class ="percentClass(bench.percent) "
268
+ v-bind:href ="percentLink(data.b.commit, data.a.commit, bench.name, bench.casename) ">
269
+ {{ bench.percent }} %
270
+ </ a >
271
+ </ div >
272
+ </ div >
253
273
</ div >
254
- < a v-if ="data.next " v-bind:href ="nextLink "> →</ a >
255
- < a v-if ="data.a.pr " v-bind:href ="prLink(data.a.pr) "> #{{data.a.pr}}</ a >
256
- < a v-if ="data.b.pr " v-bind:href ="prLink(data.b.pr) "> #{{data.b.pr}}</ a >
257
274
</ div >
258
275
< br >
259
276
< div id ="as-of "> </ div >
@@ -283,6 +300,98 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
283
300
} ,
284
301
compareLink : function ( ) {
285
302
return `https://github.com/rust-lang/rust/compare/${ this . data . a . commit } ...${ this . data . b . commit } ` ;
303
+ } ,
304
+ benches : function ( ) {
305
+ let data = this . data ;
306
+
307
+
308
+ function shouldShowBuild ( name ) {
309
+ if ( name == "full" ) {
310
+ return document . querySelector ( "#build-full" ) . checked ;
311
+ } else if ( name == "incr-full" ) {
312
+ return document . querySelector ( "#build-incremental-full" ) . checked ;
313
+ } else if ( name == "incr-unchanged" ) {
314
+ return document . querySelector ( "#build-incremental-unchanged" ) . checked ;
315
+ } else if ( name . startsWith ( "incr-patched" ) ) {
316
+ return document . querySelector ( "#build-incremental-patched" ) . checked ;
317
+ } else {
318
+ // Unknown, but by default we should show things
319
+ return true ;
320
+ }
321
+ }
322
+ function to_fields ( name ) {
323
+ let source = data . a . data [ name ] || data . b . data [ name ] ;
324
+ let max_length = 0 ;
325
+ if ( data . a . data [ name ] ) {
326
+ max_length = data . a . data [ name ] . length ;
327
+ }
328
+ if ( data . b . data [ name ] && data . b . data [ name ] . length > max_length ) {
329
+ max_length = data . b . data [ name ] . length ;
330
+ }
331
+
332
+ let keys = { } ;
333
+ if ( data . a . data [ name ] ) {
334
+ for ( let i = 0 ; i < data . a . data [ name ] . length ; i ++ ) {
335
+ if ( ! keys [ data . a . data [ name ] [ i ] [ 0 ] ] ) {
336
+ keys [ data . a . data [ name ] [ i ] [ 0 ] ] = { } ;
337
+ }
338
+ keys [ data . a . data [ name ] [ i ] [ 0 ] ] . a_idx = i ;
339
+ }
340
+ }
341
+ if ( data . b . data [ name ] ) {
342
+ for ( let i = 0 ; i < data . b . data [ name ] . length ; i ++ ) {
343
+ if ( ! keys [ data . b . data [ name ] [ i ] [ 0 ] ] ) {
344
+ keys [ data . b . data [ name ] [ i ] [ 0 ] ] = { } ;
345
+ }
346
+ keys [ data . b . data [ name ] [ i ] [ 0 ] ] . b_idx = i ;
347
+ }
348
+ }
349
+
350
+ let fields = [ ] ;
351
+ for ( let key in keys ) {
352
+ let a_idx = keys [ key ] . a_idx ;
353
+ let b_idx = keys [ key ] . b_idx ;
354
+ let datum_a = null ;
355
+ let datum_b = null ;
356
+ if ( a_idx != undefined && b_idx != undefined ) {
357
+ datum_a = data . a . data [ name ] [ a_idx ] [ 1 ] ;
358
+ datum_b = data . b . data [ name ] [ b_idx ] [ 1 ] ;
359
+ } else if ( a_idx != undefined ) {
360
+ datum_a = data . a . data [ name ] [ a_idx ] [ 1 ] ;
361
+ } else if ( b_idx != undefined ) {
362
+ datum_b = data . b . data [ name ] [ b_idx ] [ 1 ] ;
363
+ } else {
364
+ // should be unreachable
365
+ }
366
+ if ( shouldShowBuild ( key ) ) {
367
+ fields . push ( {
368
+ name,
369
+ casename : key ,
370
+ datum_a,
371
+ datum_b,
372
+ percent : percent_chg ( datum_a , datum_b ) . toFixed ( 1 ) ,
373
+ } ) ;
374
+ }
375
+ }
376
+
377
+ return fields ;
378
+ }
379
+ let test_names = unique ( [
380
+ ...Object . keys ( data . a . data ) ,
381
+ ...Object . keys ( data . b . data ) ,
382
+ ] ) ;
383
+ // let bootstrap_names = unique([
384
+ // ...Object.keys(data.a.bootstrap),
385
+ // ...Object.keys(data.b.bootstrap),
386
+ // ]);
387
+
388
+ let fields = [
389
+ // ...bootstrap_names
390
+ // .map(name => name)
391
+ // .map(name => ({ name, is_bootstrap: true, fields: to_fields_bootstrap(name) })),
392
+ ...test_names . map ( name => to_fields ( name ) ) . flat ( )
393
+ ] ;
394
+ return fields ;
286
395
}
287
396
} ,
288
397
methods : {
@@ -291,7 +400,28 @@ <h1>Comparing <span id="stat-header">instructions:u</span> between <span id="bef
291
400
} ,
292
401
prLink : function ( pr ) {
293
402
return `https://github.com/rust-lang/rust/pull/${ pr } ` ;
403
+ } ,
404
+ percentClass : function ( pct ) {
405
+ let klass = "" ;
406
+ if ( pct > 1 ) {
407
+ klass = 'positive' ;
408
+ } else if ( pct > 0.1 ) {
409
+ klass = 'slightly-positive' ;
410
+ } else if ( pct < - 1 ) {
411
+ klass = 'negative' ;
412
+ } else if ( pct < - 0.1 ) {
413
+ klass = 'slightly-negative' ;
414
+ }
415
+ return klass ;
416
+
417
+ } ,
418
+ detailedQueryLink ( commit , bench , run ) {
419
+ return `/detailed-query.html?commit=${ commit } &benchmark=${ bench } &run_name=${ run } ` ;
420
+ } ,
421
+ percentLink ( commit , baseCommit , bench , run ) {
422
+ return `/detailed-query.html?commit=${ commit } &base_commit=${ baseCommit } &benchmark=${ bench } &run_name=${ run } ` ;
294
423
}
424
+
295
425
}
296
426
} )
297
427
function toggleFilters ( id , toggle ) {
0 commit comments