Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-05-07 01:49:59

0001 #!/usr/bin/env python3
0002 import json
0003 
0004 from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
0005 parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
0006 parser.add_argument("-f", "--format", dest="fmt", default="txt", help="output format")
0007 parser.add_argument("-H", "--header", dest="header", action="store_true", default=False, help="print headers")
0008 parser.add_argument("--base", dest="base", default="{}.json,{}_timing_report.json", help="comma-separated base name for size and timing files")
0009 parser.add_argument("--ref", dest="ref", default="ref/", help="path to the reference files")
0010 parser.add_argument("job", type=str, nargs='+')
0011 options = parser.parse_args()
0012 
0013 headers = [ 'workflow' , 'id' , 'kb/ev' , 'ref kb/ev' , 'diff kb/ev' , 'ev/s/thd' , 'ref ev/s/thd' , 'diff rate' , 'mem/thd' , 'ref mem/thd' ]
0014 start, sep, end = "", "\t", ""
0015 if options.fmt == "md": 
0016     start, sep, end = "| ", " | ", " |"
0017 
0018 def prow(x): 
0019     print(start + sep.join(x) + end)
0020 
0021 first = True
0022 
0023 size_pattern,timing_pattern = options.base.split(',')
0024 for job in options.job:
0025 
0026     try:
0027         wf_id = job.split("_")[0]
0028         wf_name = "_".join(job.split("_")[1:])
0029     # Just in case... Should never happen.
0030     except IndexError:
0031         wf_id = ""
0032         wf_name = job
0033 
0034     size_json=size_pattern.format(job)
0035     size_ref_json=options.ref+'/'+size_json
0036     timing_json=timing_pattern.format(job)
0037     timing_ref_json=options.ref+'/'+timing_json
0038 
0039     try:
0040 
0041         jnew = json.load(open(size_json,'r'))
0042         jref = json.load(open(size_ref_json,'r'))
0043         size_new = jnew["trees"]["Events"]['allsize']/jnew["trees"]["Events"]['entries']
0044         size_ref = jref["trees"]["Events"]['allsize']/jref["trees"]["Events"]['entries']
0045 
0046         jnew_t = json.load(open(timing_json,'r'))
0047         jref_t = json.load(open(timing_ref_json,'r'))
0048         rate_new = jnew_t["Timing/EventThroughput"]/jnew_t["Timing/NumberOfThreads"]
0049         rate_ref = jref_t["Timing/EventThroughput"]/jref_t["Timing/NumberOfThreads"]
0050         try:
0051             rmem_new = jnew_t["ApplicationMemory/PeakValueRss"]/jnew_t["Timing/NumberOfThreads"]
0052             rmem_ref = jref_t["ApplicationMemory/PeakValueRss"]/jref_t["Timing/NumberOfThreads"]
0053         except KeyError:
0054             rmem_new = 0
0055             rmem_ref = 0
0056 
0057         if first and options.header:
0058             prow(headers)
0059             if options.fmt == "md": prow("---" for x in headers)
0060             first = False
0061 
0062         prow([ wf_name, wf_id, '%.3f' % size_new, '%.3f' % size_ref, '%.3f ( %+.1f%% )' % (size_new - size_ref,  (size_new-size_ref)/size_ref * 100 ),
0063                '%.2f'%rate_new, '%.2f'%rate_ref, '%+.1f%%'%((rate_new-rate_ref)/rate_ref*100), '%.3f'%(rmem_new/1000), '%.3f'%(rmem_ref/1000)  ])
0064 
0065     except IOError: # some file not existing
0066         #print(f'file {size_json}, {size_ref_json}, {timing_json} or {timing_ref_json} does not exist')
0067         pass