From cdb6e3e5c5724098ba072af91f9dff283a13ef72 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Fri, 18 Jul 2025 14:31:24 +0100 Subject: [PATCH] bitbake: utils: Split profile reports into separate files Use a more logical name for the profile reports and put each report into a separate file since people struggle to discover them currently. (Bitbake rev: a8145c84e0899285a5e6a809f1515118b002b106) Signed-off-by: Richard Purdie --- bitbake/lib/bb/cooker.py | 6 +++--- bitbake/lib/bb/utils.py | 34 ++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index fe33a4f34c..0ad79bd53e 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -2241,9 +2241,9 @@ class CookerParser(object): profiles.append(logfile) if profiles: - pout = "profile-parse.log.processed" - bb.utils.process_profilelog(profiles, pout = pout) - print("Processed parsing statistics saved to %s" % (pout)) + fn_out = "profile-parse.log.report" + bb.utils.process_profilelog(profiles, fn_out=fn_out) + print("Processed parsing statistics saved to %s" % (fn_out)) def final_cleanup(self): if self.syncthread: diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py index 016036dbce..c288c826c0 100644 --- a/bitbake/lib/bb/utils.py +++ b/bitbake/lib/bb/utils.py @@ -1441,29 +1441,43 @@ def profile_function(profile, function, output_fn, process=True): prof.dump_stats(output_fn) if process: process_profilelog(output_fn) - serverlog("Raw profiling information saved to %s and processed statistics to %s.processed" % (output_fn, output_fn)) + serverlog("Raw profiling information saved to %s and processed statistics to %s.report*" % (output_fn, output_fn)) return ret else: return function() -def process_profilelog(fn, pout = None): +def process_profilelog(fn, fn_out = None): # Either call with a list of filenames and set pout or a filename and optionally pout. - if not pout: - pout = fn + '.processed' + import pstats - with open(pout, 'w') as pout: - import pstats + if not fn_out: + fn_out = fn + '.report' + + def pstatopen(): if isinstance(fn, list): - p = pstats.Stats(*fn, stream=pout) - else: - p = pstats.Stats(fn, stream=pout) + return pstats.Stats(*fn, stream=pout) + return pstats.Stats(fn, stream=pout) + + with open(fn_out + '.time', 'w') as pout: + p = pstatopen() p.sort_stats('time') p.print_stats() + + with open(fn_out + '.time-callers', 'w') as pout: + p = pstatopen() + p.sort_stats('time') p.print_callers() + + with open(fn_out + '.cumulative', 'w') as pout: + p = pstatopen() p.sort_stats('cumulative') p.print_stats() - pout.flush() + with open(fn_out + '.cumulative-callers', 'w') as pout: + p = pstatopen() + p.sort_stats('cumulative') + p.print_callers() + # # Was present to work around multiprocessing pool bugs in python < 2.7.3