[PATCH 4 of 5] revset: prefetch an attribute in _generatorset.__iter__

Pierre-Yves David pierre-yves.david at ens-lyon.org
Wed Sep 24 11:33:03 CDT 2014



On 09/24/2014 08:28 AM, Augie Fackler wrote:
> On Fri, Sep 19, 2014 at 03:33:57PM -0700, Pierre-Yves David wrote:
>> # HG changeset patch
>> # User Pierre-Yves David <pierre-yves.david at fb.com>
>> # Date 1411080765 25200
>> #      Thu Sep 18 15:52:45 2014 -0700
>> # Node ID bfaab5271eb80fd282784864193e0d57a1ceef89
>> # Parent  a2b305e889547516d7952ee8ecd67948cd8ff360
>> revset: prefetch an attribute in _generatorset.__iter__
>>
>> Python's attribute lookup are expensible, lets do less of them.
>>
>> This gives us a 7% speedup on this revset iteration (from 0.063403 to 0.059032)
>>
>> diff --git a/mercurial/revset.py b/mercurial/revset.py
>> --- a/mercurial/revset.py
>> +++ b/mercurial/revset.py
>> @@ -2655,16 +2655,17 @@ class _generatorset(object):
>>           #
>>           # Getting ride of it would provide an about 15% speed up on this
>>           # iteration.
>>           i = 0
>>           genlist = self._genlist
>> -        consume = self._consumegen()
>> +        nextrev = self._consumegen().next
>> +        _len = len # cache global lookup
>
> Did this really make a difference? The caching of the __builtin__, I
> mean (caching nextrev is obviously going to save some time.)

Yes, the global is catch using LOAD_GLOBAL (or something like that) that 
does a dictionnary lookup on all context abov this function. caching the 
builtin in a local free variable makes it as expensive as loading a 
local variable (lookup in an array)

I do not remember the interdependent speed boost but there was some.

-- 
Pierre-Yves David


More information about the Mercurial-devel mailing list