commit: 325c5734ee357d03b6da36c53bbb48de62ca5666
Author: Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Nov 23 12:04:30 2015 +0000
Commit: Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Fri Dec 18 01:53:22 2015 +0000
URL: https://gitweb.gentoo.org/proj/catalyst.git/commit/?id=325c5734
main: add a --profile option
When things get slow, this option helps narrow down where things
are getting hung up.
catalyst/main.py | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/catalyst/main.py b/catalyst/main.py
index 3550809..cb90e66 100644
--- a/catalyst/main.py
+++ b/catalyst/main.py
@@ -174,6 +174,9 @@ $ catalyst -f stage1-specfile.spec"""
group.add_argument('--trace',
default=False, action='store_true',
help='trace program output (akin to `sh -x`)')
+ group.add_argument('--profile',
+ default=False, action='store_true',
+ help='profile program execution')
group = parser.add_argument_group('Temporary file management')
group.add_argument('-a', '--clear-autoresume',
@@ -243,6 +246,25 @@ def trace(func, *args, **kwargs):
return tracer.runfunc(func, *args, **kwargs)
+def profile(func, *args, **kwargs):
+ """Run |func| through the profile module"""
+ # Should make this an option.
+ sort_keys = ('time',)
+
+ # Collect the profile.
+ import cProfile
+ profiler = cProfile.Profile(subcalls=True, builtins=True)
+ try:
+ ret = profiler.runcall(func, *args, **kwargs)
+ finally:
+ # Then process the results.
+ import pstats
+ stats = pstats.Stats(profiler, stream=sys.stderr)
+ stats.strip_dirs().sort_stats(*sort_keys).print_stats()
+
+ return ret
+
+
def main(argv):
"""The main entry point for frontends to use"""
parser = get_parser()
@@ -250,6 +272,8 @@ def main(argv):
if opts.trace:
return trace(_main, parser, opts)
+ elif opts.profile:
+ return profile(_main, parser, opts)
else:
return _main(parser, opts)