[PATCH 2 of 2] dispatch: start profiling earlier
Augie Fackler
raf at durin42.com
Tue Feb 14 15:45:06 UTC 2017
On Mon, Feb 13, 2017 at 08:50:11PM -0800, Bryan O'Sullivan wrote:
> # HG changeset patch
> # User Bryan O'Sullivan <bryano at fb.com>
> # Date 1487047661 28800
> # Mon Feb 13 20:47:41 2017 -0800
> # Node ID fa6f486c80910c2a3ce6df58be0b8e616f2ae679
> # Parent 82467bdb090b2500a97ae92e239bcdf72974f3f7
> dispatch: start profiling earlier
Queued these, many thanks.
>
> This makes it possible to profile extension loading and setup, which
> takes a substantial fraction of overall execution time for fast
> commands.
>
> (99% of this commit is simply changes of indentation to reflect the
> hoisting of the two calls to maybeprofile to a single one that
> happens earlier.)
>
> diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
> --- a/mercurial/dispatch.py
> +++ b/mercurial/dispatch.py
> @@ -664,98 +664,97 @@ def _dispatch(req):
> for ui_ in uis:
> ui_.setconfig('profiling', 'enabled', 'true', '--profile')
>
> - # Configure extensions in phases: uisetup, extsetup, cmdtable, and
> - # reposetup. Programs like TortoiseHg will call _dispatch several
> - # times so we keep track of configured extensions in _loaded.
> - extensions.loadall(lui)
> - exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
> - # Propagate any changes to lui.__class__ by extensions
> - ui.__class__ = lui.__class__
> + with profiling.maybeprofile(lui):
> + # Configure extensions in phases: uisetup, extsetup, cmdtable, and
> + # reposetup. Programs like TortoiseHg will call _dispatch several
> + # times so we keep track of configured extensions in _loaded.
> + extensions.loadall(lui)
> + exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
> + # Propagate any changes to lui.__class__ by extensions
> + ui.__class__ = lui.__class__
>
> - # (uisetup and extsetup are handled in extensions.loadall)
> + # (uisetup and extsetup are handled in extensions.loadall)
>
> - for name, module in exts:
> - for objname, loadermod, loadername in extraloaders:
> - extraobj = getattr(module, objname, None)
> - if extraobj is not None:
> - getattr(loadermod, loadername)(ui, name, extraobj)
> - _loaded.add(name)
> + for name, module in exts:
> + for objname, loadermod, loadername in extraloaders:
> + extraobj = getattr(module, objname, None)
> + if extraobj is not None:
> + getattr(loadermod, loadername)(ui, name, extraobj)
> + _loaded.add(name)
>
> - # (reposetup is handled in hg.repository)
> + # (reposetup is handled in hg.repository)
>
> - # Side-effect of accessing is debugcommands module is guaranteed to be
> - # imported and commands.table is populated.
> - debugcommands.command
> -
> - addaliases(lui, commands.table)
> + # Side-effect of accessing is debugcommands module is guaranteed to be
> + # imported and commands.table is populated.
> + debugcommands.command
>
> - # All aliases and commands are completely defined, now.
> - # Check abbreviation/ambiguity of shell alias.
> - shellaliasfn = _checkshellalias(lui, ui, args)
> - if shellaliasfn:
> - with profiling.maybeprofile(lui):
> + addaliases(lui, commands.table)
> +
> + # All aliases and commands are completely defined, now.
> + # Check abbreviation/ambiguity of shell alias.
> + shellaliasfn = _checkshellalias(lui, ui, args)
> + if shellaliasfn:
> return shellaliasfn()
>
> - # check for fallback encoding
> - fallback = lui.config('ui', 'fallbackencoding')
> - if fallback:
> - encoding.fallbackencoding = fallback
> + # check for fallback encoding
> + fallback = lui.config('ui', 'fallbackencoding')
> + if fallback:
> + encoding.fallbackencoding = fallback
>
> - fullargs = args
> - cmd, func, args, options, cmdoptions = _parse(lui, args)
> + fullargs = args
> + cmd, func, args, options, cmdoptions = _parse(lui, args)
>
> - if options["config"]:
> - raise error.Abort(_("option --config may not be abbreviated!"))
> - if options["cwd"]:
> - raise error.Abort(_("option --cwd may not be abbreviated!"))
> - if options["repository"]:
> - raise error.Abort(_(
> - "option -R has to be separated from other options (e.g. not -qR) "
> - "and --repository may only be abbreviated as --repo!"))
> + if options["config"]:
> + raise error.Abort(_("option --config may not be abbreviated!"))
> + if options["cwd"]:
> + raise error.Abort(_("option --cwd may not be abbreviated!"))
> + if options["repository"]:
> + raise error.Abort(_(
> + "option -R has to be separated from other options (e.g. not -qR) "
> + "and --repository may only be abbreviated as --repo!"))
>
> - if options["encoding"]:
> - encoding.encoding = options["encoding"]
> - if options["encodingmode"]:
> - encoding.encodingmode = options["encodingmode"]
> - if options["time"]:
> - def get_times():
> - t = os.times()
> - if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
> - t = (t[0], t[1], t[2], t[3], time.clock())
> - return t
> - s = get_times()
> - def print_time():
> - t = get_times()
> - ui.warn(_("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
> - (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
> - atexit.register(print_time)
> + if options["encoding"]:
> + encoding.encoding = options["encoding"]
> + if options["encodingmode"]:
> + encoding.encodingmode = options["encodingmode"]
> + if options["time"]:
> + def get_times():
> + t = os.times()
> + if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
> + t = (t[0], t[1], t[2], t[3], time.clock())
> + return t
> + s = get_times()
> + def print_time():
> + t = get_times()
> + ui.warn(_("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
> + (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
> + atexit.register(print_time)
>
> - if options['verbose'] or options['debug'] or options['quiet']:
> - for opt in ('verbose', 'debug', 'quiet'):
> - val = str(bool(options[opt]))
> + if options['verbose'] or options['debug'] or options['quiet']:
> + for opt in ('verbose', 'debug', 'quiet'):
> + val = str(bool(options[opt]))
> + for ui_ in uis:
> + ui_.setconfig('ui', opt, val, '--' + opt)
> +
> + if options['traceback']:
> for ui_ in uis:
> - ui_.setconfig('ui', opt, val, '--' + opt)
> + ui_.setconfig('ui', 'traceback', 'on', '--traceback')
>
> - if options['traceback']:
> - for ui_ in uis:
> - ui_.setconfig('ui', 'traceback', 'on', '--traceback')
> -
> - if options['noninteractive']:
> - for ui_ in uis:
> - ui_.setconfig('ui', 'interactive', 'off', '-y')
> + if options['noninteractive']:
> + for ui_ in uis:
> + ui_.setconfig('ui', 'interactive', 'off', '-y')
>
> - if cmdoptions.get('insecure', False):
> - for ui_ in uis:
> - ui_.insecureconnections = True
> + if cmdoptions.get('insecure', False):
> + for ui_ in uis:
> + ui_.insecureconnections = True
>
> - if options['version']:
> - return commands.version_(ui)
> - if options['help']:
> - return commands.help_(ui, cmd, command=cmd is not None)
> - elif not cmd:
> - return commands.help_(ui, 'shortlist')
> + if options['version']:
> + return commands.version_(ui)
> + if options['help']:
> + return commands.help_(ui, cmd, command=cmd is not None)
> + elif not cmd:
> + return commands.help_(ui, 'shortlist')
>
> - with profiling.maybeprofile(lui):
> repo = None
> cmdpats = args[:]
> if not func.norepo:
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list