Skip to content

Commit 3bc05b7

Browse files
authored
Merge pull request swiftlang#102 from graydon/run-cperf-misc-fixes
[run_cperf] Miscellaneous reporting improvements to run_cperf.
2 parents e1cd654 + 0f8d894 commit 3bc05b7

File tree

1 file changed

+92
-55
lines changed

1 file changed

+92
-55
lines changed

run_cperf

Lines changed: 92 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -299,13 +299,14 @@ def execute_runner(instance, workspace, configs, args):
299299
runner_command += get_sandbox_profile_flags()
300300
if args.verbose:
301301
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"])
309310
return failures
310311

311312

@@ -324,9 +325,12 @@ def get_reference_desc(reference, config):
324325
(reference, config))
325326

326327

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))
330334

331335

332336
def make_internal_link(desc, run_id):
@@ -355,51 +359,66 @@ def analyze_results(configs, failures, args):
355359
run_id = hex(random.randint(1, 2**63))[2:]
356360
old_ws = get_workspace_for_instance(OLD_INSTANCE, args)
357361
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)
361366
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']
365370

366371
returncodes = []
367372
for config in configs:
368373
variant = get_variant(config, args)
369374
sd_old = get_stats_dir(OLD_INSTANCE, variant)
370375
sd_new = get_stats_dir(NEW_INSTANCE, variant)
371376
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 [])
372381
returncodes.append(
373382
common.execute(
374383
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,
380390
'--compare-stats-dirs', sd_old, sd_new]))
381391
returncodes.append(
382392
common.execute(
383393
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,
387400
'--compare-stats-dirs', sd_old, sd_new]))
388-
if os.path.exists(baseline):
401+
if args.show_baselines and os.path.exists(baseline):
389402
returncodes.append(
390403
common.execute(
391404
common_args +
392405
['--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,
395412
'--compare-to-csv-baseline', baseline, sd_new]))
396413
returncodes.append(
397414
common.execute(
398415
common_args +
399416
['--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,
403422
'--compare-to-csv-baseline', baseline, sd_new]))
404423

405424
out = args.output
@@ -419,11 +438,17 @@ def analyze_results(configs, failures, args):
419438
cdesc = get_config_desc(config)
420439
out.write('- %s\n' % make_internal_link(cdesc, run_id))
421440
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))
424448
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))
427452

428453
out.write('\n\n')
429454

@@ -433,13 +458,18 @@ def analyze_results(configs, failures, args):
433458
out.write(make_internal_anchor(cdesc, run_id))
434459
out.write("\n# %s\n" % cdesc)
435460
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)
439469
for subset in subsets:
440-
tdesc = get_table_desc(reference, subset, config)
470+
tdesc = get_table_desc(refqual, subset, config)
441471
out.write(make_internal_anchor(tdesc, run_id))
442-
out.write("\n### %s\n" % tdesc)
472+
out.write("\n" + rindent + "## " + tdesc + "\n")
443473
table = get_table_name(reference, subset, variant)
444474
if os.path.exists(table):
445475
if os.stat(table).st_size == 0:
@@ -451,22 +481,23 @@ def analyze_results(configs, failures, args):
451481
else:
452482
out.write("\nNo analysis available\n")
453483

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')
470501

471502
return regressions
472503

@@ -510,6 +541,12 @@ def parse_args():
510541
type=str, default=None)
511542
parser.add_argument('--new-swiftc',
512543
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)
513550
return parser.parse_args()
514551

515552

0 commit comments

Comments
 (0)