mistral/tools/rank_profiled_methods.py
Renat Akhmerov 1fce28c1ce Add a script to generate a report about profile traces
* It allows to convert a profiler log into a convenient report
  that has a general statistics about profile traces: total time,
  maximum time, average time and number of occurrences.

Change-Id: I68ff2a6eb74f1f8b11cd7568dc27bcbc9430e8e1
2019-04-08 11:00:09 +07:00

100 lines
2.9 KiB
Python

# Copyright 2019 - Nokia Networks
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
"""
import sys
def _print_help():
print("\nUsage: <script_name> <input_file_name> <output_file_name>\n")
print(
'The script processes a Mistral profiler log file (<input_file_name)\n'
'and generates a report into a file (<output_file_name>) that\n'
'contains statistics about each profiler trace: \n'
'-------------------------------------------------------------\n'
' Total time | Max time | Avg time | Occurrences | Trace name \n'
'-------------------------------------------------------------\n'
' ... ... ... ... ...\n'
)
def main():
try:
in_file_name = str(sys.argv[1])
out_file_name = str(sys.argv[2])
except:
_print_help()
return "Failed to parse arguments."
print('Ranking profiled methods...')
in_f = open(in_file_name, 'r')
out_f = open(out_file_name, 'w')
# {trace_name: [total_time, max_time, occurrences]}
d = dict()
with in_f:
for line in in_f:
tokens = line.split()
# Skip all "-start" lines that don't contain a duration in seconds.
# Processing only "-stop" lines.
if len(tokens[1]) > 10:
continue
trace_name = tokens[5]
trace_name = trace_name[0:len(trace_name) - 5]
duration = float(tokens[1])
if trace_name not in d:
d[trace_name] = [duration, duration, 1]
else:
l = d[trace_name]
l[0] = l[0] + duration
l[2] = l[2] + 1
if duration > l[1]:
l[1] = duration
result = sorted(d.items(), key=lambda x: x[1][0], reverse=True)
out_f.write('Total time | Max time | Avg time | Occurrences | Trace name\n')
out_f.write('-' * 90)
out_f.write('-\n')
for item in result:
out_f.write(
'{0:<12.3f} {1:<10.3f} {2:<10.3f} {3:<13d} {4}\n'.format(
item[1][0],
item[1][1],
item[1][0] / item[1][2],
item[1][2],
item[0]
)
)
out_f.close()
print("Ranking file was successfully created: %s" % out_file_name)
if __name__ == '__main__':
sys.exit(main())