Perf will show which binaries are using the CPU cycles, and standard python profilers will show which python functions, but neither is great at finding which call to an external binary is taking time, or locating I/O hotspots. --- notmuch-git.in | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/notmuch-git.in b/notmuch-git.in index d8b7e45b..0d9f50a1 100755 --- a/notmuch-git.in +++ b/notmuch-git.in @@ -128,6 +128,20 @@ def _xapian_unquote(string): return string +def timed(fn): + """Timer decorator""" + from time import perf_counter + + def inner(*args, **kwargs): + start_time = perf_counter() + rval = fn(*args, **kwargs) + end_time = perf_counter() + _LOG.info('{0}: {1:.8f}s elapsed'.format(fn.__name__, end_time - start_time)) + return rval + + return inner + + class SubprocessError(RuntimeError): "A subprocess exited with a nonzero status" def __init__(self, args, status, stdout=None, stderr=None): @@ -360,6 +374,7 @@ def commit(treeish='HEAD', message=None): _git(args=['read-tree', treeish], wait=True) raise +@timed def _update_index(status): with _git( args=['update-index', '--index-info'], @@ -600,6 +615,7 @@ def _is_unmerged(ref='@{upstream}'): return base != fetch_head +@timed def get_status(): status = { 'deleted': {}, @@ -620,7 +636,7 @@ def get_status(): _os.remove(index) return status - +@timed def _index_tags(): "Write notmuch tags to the nmbug.index." path = _os.path.join(NMBGIT, 'nmbug.index') @@ -669,6 +685,7 @@ def _index_tags_for_message(id, status, tags): yield '{mode} {hash}\t{path}\n'.format(mode=mode, hash=hash, path=path) +@timed def _diff_index(index, filter): """ Get an {id: {tag, ...}} dict for a given filter. -- 2.35.2 _______________________________________________ notmuch mailing list -- notmuch@notmuchmail.org To unsubscribe send an email to notmuch-le...@notmuchmail.org