[PATCH] commands: use a class as decorator to build table incrementally

Adrian Buehlmann adrian at cadifra.com
Wed May 11 16:14:00 CDT 2011


On 2011-05-11 20:23, Sune Foldager wrote:
> On 2011-05-11 12:27, Matt Mackall wrote:
>> On Wed, 2011-05-11 at 18:13 +0200, Adrian Buehlmann wrote:
>>> # HG changeset patch
>>> # User Adrian Buehlmann <adrian at cadifra.com>
>>> # Date 1305097807 -7200
>>> # Node ID 8b331aca1943f7840591dd3289e55f99ba164375
>>> # Parent  c97d8485b5fa46c94b8afcfab0cde97629ba4086
>>> commands: use a class as decorator to build table incrementally
>>>
>>> this allows to define the table entries near the command function
>>
>> Thanks, we probably should have done something like this years ago.
> 
> Did you(pl.) read the mail in the other thread about class'es here
> performing substantially worse than functions? Not that I have the
> slightest idea how much we are talking about.

I've read that as well.

I measured running from source with x64 python on Windows 7 x64.

I did a 'hg log -l 1' on the mercurial repo.

Using the Measure-Command from Windows PowerShell

   Measure-Command { hg log -l 1 } 

shows ~180 ms with or without my patch (after a couple of runs, so warm
caches).

Then I modified the patched commands.py like this:

i = 0
while i < 1000000:
    @command('version', [])
    def version_(ui):
        """output version and copyright information"""
        ui.write(_("Mercurial Distributed SCM (version %s)\n")
                 % util.version())
        ui.status(_(
            "(see http://mercurial.selenic.com for more information)\n"
            "\nCopyright (C) 2005-2011 Matt Mackall and others\n"
            "This is free software; see the source for copying conditions. "
            "There is NO\nwarranty; "
            "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
        ))
    i += 1

Which causes the decorator to be called one million time.

The same hg log call was then ~1.9 seconds.

Seems good enough to me.


More information about the Mercurial-devel mailing list