@@ -299,13 +299,14 @@ def execute_runner(instance, workspace, configs, args):
299
299
runner_command += get_sandbox_profile_flags ()
300
300
if args .verbose :
301
301
runner_command += ["--verbose" ]
302
- try :
303
- common .check_execute (runner_command , timeout = 9999999 )
304
- except common .ExecuteCommandFailure :
305
- fail_logs = [ re .sub ('FAIL_.*_(\\ w+).log' , '\\ 1' , n )
306
- for n in os .listdir ("." )
307
- if re .match ('FAIL.*.log' , n )]
308
- failures += (fail_logs if len (fail_logs ) != 0 else ["unknown" ])
302
+ for i in range (args .repetitions ):
303
+ try :
304
+ common .check_execute (runner_command , timeout = 9999999 )
305
+ except common .ExecuteCommandFailure :
306
+ fail_logs = [re .sub ('FAIL_\w+_(\\ w+).*\\ .log' , '\\ 1' , n )
307
+ for n in os .listdir ("." )
308
+ if re .match ('FAIL.*.log' , n )]
309
+ failures += (fail_logs if len (fail_logs ) != 0 else ["unknown" ])
309
310
return failures
310
311
311
312
@@ -324,9 +325,12 @@ def get_reference_desc(reference, config):
324
325
(reference , config ))
325
326
326
327
327
- def get_table_desc (reference , subset , config ):
328
- return ("PR vs. %s, changed %s (%s)" %
329
- (reference , subset , config ))
328
+ def get_table_desc (refqual , subset , config ):
329
+ if refqual is not None :
330
+ return ("PR vs. %s, changed %s (%s)" %
331
+ (refqual , subset , config ))
332
+ else :
333
+ return ("%s %s" % (config , subset ))
330
334
331
335
332
336
def make_internal_link (desc , run_id ):
@@ -355,51 +359,66 @@ def analyze_results(configs, failures, args):
355
359
run_id = hex (random .randint (1 , 2 ** 63 ))[2 :]
356
360
old_ws = get_workspace_for_instance (OLD_INSTANCE , args )
357
361
process_stats = os .path .join (old_ws , 'swift/utils/process-stats-dir.py' )
358
- references = ('head' , 'baseline' )
359
- subsets = ('counters' , 'timers' )
360
-
362
+ references = ('head' , 'baseline' ) if args .show_baselines else ('head' ,)
363
+ subsets = ('brief' , 'detailed' )
364
+ delta_usec_thresh = str (100 * 1000 )
365
+ delta_pct_thresh = str (1 )
361
366
common_args = [process_stats ,
362
- '--markdown' , "--github-emoji" ,
363
- '--group-by-module' ,
364
- '--sort -by-delta-pct' , '--sort-descending ' ]
367
+ '--markdown' , "--github-emoji" ]
368
+ if args . group_by_module :
369
+ common_args += [ '--group -by-module ' ]
365
370
366
371
returncodes = []
367
372
for config in configs :
368
373
variant = get_variant (config , args )
369
374
sd_old = get_stats_dir (OLD_INSTANCE , variant )
370
375
sd_new = get_stats_dir (NEW_INSTANCE , variant )
371
376
baseline = get_baseline_name (variant )
377
+ select_stats_from_baseline_args = (
378
+ ["--select-stats-from-csv-baseline" , baseline ]
379
+ if os .path .exists (baseline )
380
+ else [])
372
381
returncodes .append (
373
382
common .execute (
374
383
common_args +
375
- (["--select-stats-from-csv-baseline" , baseline ]
376
- if os .path .exists (baseline )
377
- else []) +
378
- ['--output' , get_table_name ('head' , 'counters' , variant ),
379
- '--exclude-timers' ,
384
+ ['--output' , get_table_name ('head' , 'brief' , variant ),
385
+ '--divide-by' , str (args .repetitions ),
386
+ '--select-stat' , r'driver.*wall|NumLLVMBytesOutput' ,
387
+ '--merge-timers' ,
388
+ '--delta-pct-thresh' , delta_pct_thresh ,
389
+ '--delta-usec-thresh' , delta_usec_thresh ,
380
390
'--compare-stats-dirs' , sd_old , sd_new ]))
381
391
returncodes .append (
382
392
common .execute (
383
393
common_args +
384
- ['--output' , get_table_name ('head' , 'timers' , variant ),
385
- '--delta-usec-thresh' , '1000000' ,
386
- '--select-stat' , 'driver.*wall' ,
394
+ select_stats_from_baseline_args +
395
+ ['--output' , get_table_name ('head' , 'detailed' , variant ),
396
+ '--exclude-timers' ,
397
+ '--divide-by' , str (args .repetitions ),
398
+ '--close-regressions' ,
399
+ '--delta-pct-thresh' , delta_pct_thresh ,
387
400
'--compare-stats-dirs' , sd_old , sd_new ]))
388
- if os .path .exists (baseline ):
401
+ if args . show_baselines and os .path .exists (baseline ):
389
402
returncodes .append (
390
403
common .execute (
391
404
common_args +
392
405
['--output' ,
393
- get_table_name ('baseline' , 'counters' , variant ),
394
- '--exclude-timers' ,
406
+ get_table_name ('baseline' , 'brief' , variant ),
407
+ '--select-stat' , r'driver.*wall|NumLLVMBytesOutput' ,
408
+ '--merge-timers' ,
409
+ '--divide-by' , str (args .repetitions ),
410
+ '--delta-pct-thresh' , delta_pct_thresh ,
411
+ '--delta-usec-thresh' , delta_usec_thresh ,
395
412
'--compare-to-csv-baseline' , baseline , sd_new ]))
396
413
returncodes .append (
397
414
common .execute (
398
415
common_args +
399
416
['--output' ,
400
- get_table_name ('baseline' , 'timers' , variant ),
401
- '--delta-usec-thresh' , '1000000' ,
402
- '--select-stat' , 'driver.*wall' ,
417
+ get_table_name ('baseline' , 'detailed' , variant ),
418
+ '--exclude-timers' ,
419
+ '--divide-by' , str (args .repetitions ),
420
+ '--close-regressions' ,
421
+ '--delta-pct-thresh' , delta_pct_thresh ,
403
422
'--compare-to-csv-baseline' , baseline , sd_new ]))
404
423
405
424
out = args .output
@@ -419,11 +438,17 @@ def analyze_results(configs, failures, args):
419
438
cdesc = get_config_desc (config )
420
439
out .write ('- %s\n ' % make_internal_link (cdesc , run_id ))
421
440
for reference in references :
422
- rdesc = get_reference_desc (reference , config )
423
- out .write (' - %s\n ' % make_internal_link (rdesc , run_id ))
441
+ rindent = ''
442
+ refqual = None
443
+ if len (references ) > 1 :
444
+ rindent = ' '
445
+ refqual = reference
446
+ rdesc = get_reference_desc (reference , config )
447
+ out .write (' - %s\n ' % make_internal_link (rdesc , run_id ))
424
448
for subset in subsets :
425
- tdesc = get_table_desc (reference , subset , config )
426
- out .write (' - %s\n ' % make_internal_link (tdesc , run_id ))
449
+ tdesc = get_table_desc (refqual , subset , config )
450
+ out .write ((rindent + ' - %s\n ' ) %
451
+ make_internal_link (tdesc , run_id ))
427
452
428
453
out .write ('\n \n ' )
429
454
@@ -433,13 +458,18 @@ def analyze_results(configs, failures, args):
433
458
out .write (make_internal_anchor (cdesc , run_id ))
434
459
out .write ("\n # %s\n " % cdesc )
435
460
for reference in references :
436
- rdesc = get_reference_desc (reference , config )
437
- out .write (make_internal_anchor (rdesc , run_id ))
438
- out .write ("\n ## %s\n " % rdesc )
461
+ rindent = ''
462
+ refqual = None
463
+ if len (references ) > 1 :
464
+ rindent = '#'
465
+ refqual = reference
466
+ rdesc = get_reference_desc (reference , config )
467
+ out .write (make_internal_anchor (rdesc , run_id ))
468
+ out .write ("\n ## %s\n " % rdesc )
439
469
for subset in subsets :
440
- tdesc = get_table_desc (reference , subset , config )
470
+ tdesc = get_table_desc (refqual , subset , config )
441
471
out .write (make_internal_anchor (tdesc , run_id ))
442
- out .write ("\n ### %s \n " % tdesc )
472
+ out .write ("\n " + rindent + "## " + tdesc + " \n " )
443
473
table = get_table_name (reference , subset , variant )
444
474
if os .path .exists (table ):
445
475
if os .stat (table ).st_size == 0 :
@@ -451,22 +481,23 @@ def analyze_results(configs, failures, args):
451
481
else :
452
482
out .write ("\n No analysis available\n " )
453
483
454
- out .write ('\n \n <details>\n ' )
455
- for config in configs :
456
- variant = get_variant (config , args )
457
- baseline = get_baseline_name (variant )
458
- if os .path .exists (baseline ):
459
- out .write ("Last baseline commit on %s" %
460
- os .path .basename (baseline ))
461
- out .write ("\n \n <pre>\n " )
462
- out .write (common .check_execute_output ([
463
- 'git' , 'log' , '--pretty=medium' , '-1' , baseline
464
- ]))
465
- out .write ("\n </pre>\n " )
466
- else :
467
- out .write ("No baseline file %s found" %
468
- os .path .basename (baseline ))
469
- out .write ('\n </details>\n \n ' )
484
+ if args .show_baselines :
485
+ out .write ('\n \n <details>\n ' )
486
+ for config in configs :
487
+ variant = get_variant (config , args )
488
+ baseline = get_baseline_name (variant )
489
+ if os .path .exists (baseline ):
490
+ out .write ("Last baseline commit on %s" %
491
+ os .path .basename (baseline ))
492
+ out .write ("\n \n <pre>\n " )
493
+ out .write (common .check_execute_output ([
494
+ 'git' , 'log' , '--pretty=medium' , '-1' , baseline
495
+ ]))
496
+ out .write ("\n </pre>\n " )
497
+ else :
498
+ out .write ("No baseline file %s found" %
499
+ os .path .basename (baseline ))
500
+ out .write ('\n </details>\n \n ' )
470
501
471
502
return regressions
472
503
@@ -510,6 +541,12 @@ def parse_args():
510
541
type = str , default = None )
511
542
parser .add_argument ('--new-swiftc' ,
512
543
type = str , default = None )
544
+ parser .add_argument ('--repetitions' ,
545
+ type = int , default = 3 )
546
+ parser .add_argument ('--show-baselines' ,
547
+ type = bool , default = False )
548
+ parser .add_argument ('--group-by-module' ,
549
+ type = bool , default = False )
513
550
return parser .parse_args ()
514
551
515
552
0 commit comments