[poky] [PATCH 0/1][RFC] Optimize file parsing speed

Xu, Dongxiao dongxiao.xu at intel.com
Tue Dec 7 22:53:24 PST 2010


Xu, Dongxiao wrote:
> Richard Purdie wrote:
>> On Mon, 2010-11-29 at 13:45 +0800, Xu, Dongxiao wrote:
>>> Richard Purdie wrote:
>>>> I'm going to take the patch but I'd like to be clear where the
>>>> speed gains come from with this change. I suspect some are due to a
>>>> smaller number of keys but I also suspect the smaller number of
>>>> tasks involved helps too!
>>> 
>>> I did a profiling for the parsing time w/ and w/o the patch.
>>> 
>>> Here a piece of the profiling result:
>>> 
>>> W/ PATCH:
>>> 
>>> Mon Nov 29 13:23:42 2010    profile.log
>>> 
>>>          32756805 function calls (31268348 primitive calls) in
>>> 60.195 CPU seconds 
>>> 
>>>    Ordered by: internal time
>>> 
>>>    ncalls  tottime  percall  cumtime  percall
>>>   filename:lineno(function) 3572737    4.950    0.000   12.849
>>>   0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data_smart.py:285(getVarFlag)
>>>   3917977    4.464    0.000    4.464    0.000
>>> 
>>> 
>>> 
>>> 
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data_smart.py:191(_findVar)
>>>      873129/431998    3.040    0.000   16.824    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data_smart.py:86(expandWithRefs)
>>> 1745340    3.007    0.000    4.555    0.000
>>> /usr/lib/python2.6/copy.py:65(copy) 286785    2.570    0.000
>>> 20.051    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data.py:271(build_dependencies)
>>> 565710    2.532    0.000    5.015    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/COW.py:97(__getitem__) 917
>>> 2.394    0.003   27.726    0.030
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data.py:299(generate_dependencies)
>>> 288439    2.350    0.000   11.607    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data_smart.py:212(setVar)
>>> 1428066/1144003    1.882    0.000   16.762    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data_smart.py:246(getVar) ...
>>> 2389    0.004    0.000    2.528    0.001
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data.py:267(update_data)
>>> 
>>> 
>>> W/O PATCH:
>>> 
>>> Mon Nov 29 13:28:36 2010    profile.log
>>> 
>>>          49110091 function calls (47618793 primitive calls) in
>>> 75.338 CPU seconds 
>>> 
>>>    Ordered by: internal time
>>> 
>>>    ncalls  tottime  percall  cumtime  percall
>>>   filename:lineno(function) 7547331    8.230    0.000   19.467
>>>   0.000
>>> 
>>> 
>>> 
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data_smart.py:285(getVarFlag)
>>>    7908236    8.113    0.000    8.113    0.000
>>>   /sda1/yocto/scripts/..//bitbake/lib/bb/data_smart.py:191(_findVar)
>>>    917    3.987    0.004   43.045    0.047
>>> 
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data.py:299(generate_dependencies)
>>> 5061763    3.812    0.000    5.633    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data.py:301(<genexpr>) 84656
>>> 3.318    0.000   13.475    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data.py:302(<genexpr>)
>>> 897804/450300    2.838    0.000   15.801    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data_smart.py:86(expandWithRefs)
>>> 294083    2.777    0.000   18.854    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data.py:271(build_dependencies)
>>> 1783941    2.740    0.000    4.154    0.000
>>> /usr/lib/python2.6/copy.py:65(copy) 592115    2.432    0.000
>>> 5.179    0.000
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/COW.py:97(__getitem__) ...
>>> 2389    0.004    0.000    2.656    0.001
>>> /sda1/yocto/scripts/..//bitbake/lib/bb/data.py:267(update_data)
>>> 
>>> From the profiling result we can see that, generate_dependencies()
>>> time reduces from 43 seconds to 27 seconds, while
>>> build_dependencies()
>>> mostly keeps unchanged (From 20 seconds to 18.8 seconds). Therefore
>>> the biggest overhead reduced by the patch should be the two lines of
>>> code to parsing keys in generate_dependencies() function.
>>> 
>>>> 
>>>> Also, a lot of those keys are override keys so perhaps its speeding
>>>> up update_data() calls and some of the gain is from there too?
>>> 
>>> Update_data() has some gains but not much, see the above profile
>>> result.
>> 
>> Looks good, thanks.
>> 
>> Interestingly looking at the profile overall, we dropped from 49
>> million function calls to 32 million function calls which is always
>> a good way to speed things up. 
>> 
>> getVarFlag and _findVar each dropped by 3 million calls each (which
>> is from the construction of the keys() list).
>> 
>> So a very valid speedup :). I still think we might be able to speed
>> this area up further though such as if we directly keep an index of
>> exported variables.
> 
> Hi Richard,
> 
> Like the whole d.keys(), exported variables are also different among
> recipes, since recipe may export or unset certain variables for
> itself. So to implement this, we need to keep a common list, and then
> handle recipe specific export/unset variables.  
> 
> Does my understanding correct?

Here I mean even the exported variables may be different among different recipes, since each recipe may export or unset certain variables for itself. So is it possible for us to keep a common exported variable list?

Thanks,
Dongxiao

> 
> Thanks,
> Dongxiao
> 
> 
> 
>> 
>> Cheers,
>> 
>> Richard




More information about the poky mailing list