[poky] About the operator "??="
Xu, Dongxiao
dongxiao.xu at intel.com
Thu Dec 9 04:13:57 PST 2010
Richard Purdie wrote:
> On Thu, 2010-12-09 at 15:59 +0800, Xu, Dongxiao wrote:
>> Tian, Kevin wrote:
>>>> From: Xu, Dongxiao
>>>> Sent: Thursday, December 09, 2010 11:33 AM During the file parsing
>>>> process, the getVar is called "1435156/1148654"
>>>> times (actually I am still confused what "/" means...), and among
>>>> them, 322121 times of getVar call return "None", thus about 1/3 or
>>>> 1/4 of the total calls.
>
> Ok, that is a pretty significant portion of the time.
>
>>>> I tried to use the following patch to have a test. Also I paste a
>>>> profile log. From the result we can see it has over 15%
>>>> performance gain. (from
>>>> 39.3
>>>> secs to 33.7 secs).
>
> So despite that, it still significantly helps performance. Could you
> also give some raw performance numbers? By this I mean make the
> timing runs with profiling turned off so work out the time it takes
> before and after the patch with the profiling off so the numbers are
> "real" with "time bitbake xxx"?
>
> It always pays just to sanity check and this gives the "real"
> performance gain.
Hi richard,
Here are some raw timing result:
w/ patch:
time bitbake -p
real 0m26.189s
user 0m25.480s
sys 0m0.420s
w/o patch:
time bitbake -p
real 0m30.940s
user 0m30.230s
sys 0m0.460s
Thanks,
Dongxiao
>
>>>> In usermanual, the "??=" definition is:
>>>>
>>>> Setting a default value (??=)
>>>> A ??= "somevalue"
>>>> A ??= "someothervalue"
>>>> If A is set before the above, it will retain that value. If A is
>>>> unset prior to the above, A will be set to someothervalue. This is
>>>> a lazy version of ?=, in that the assignment does not occur until
>>>> the end of the parsing process, so that the last, rather than the
>>>> first, ??= assignment to a given variable will be used.
>>>>
>>>> Our patch logic isn't strickly following the "??=" definition,
>>>> since the assignment doesn't occurs in end of parsing process...
>>>> Except this one, I think other behaviors for ??= do not change.
>>>
>>> I think it is, as long as a getVar on a variable happens after all
>>> the evaluations of that variable which I think should be true or
>>> else even current design has problem. In that way when evaluating
>>> variable assignments, you keep 'defaultvalue' updated until the
>>> last "??=" assignment. Then later a getVar() on that variable
>>> happens which then
>>> you just return the right defaultvalue. :-)
>>
>> Agree.
>
> I also agree, I think we can adjust the definition of how this is
> handled slightly. There is also a change in behaviour as now, when
> one of these variables is looked up, it will get the default value
> rather than None if finalise() hasn't been called. I don't think this
> is much of an issue though.
>
>>>> --- a/bitbake/lib/bb/parse/ast.py
>>>> +++ b/bitbake/lib/bb/parse/ast.py
>>>> @@ -109,10 +109,8 @@ class DataNode(AstNode):
>>>> if 'flag' in groupd and groupd['flag'] != None:
>>>> bb.data.setVarFlag(key, groupd['flag'], val, data)
>>>> elif groupd["lazyques"]:
>>>> - assigned = bb.data.getVar("__lazy_assigned", data) or
>>>> []
>>>> - assigned.append(key)
>>>> - bb.data.setVar("__lazy_assigned", assigned, data)
>>>> bb.data.setVarFlag(key, "defaultval", val, data)
>>>> + bb.data.setVar(key, None, data)
>>>
>>> This I think is incorrect. You actually wiped out previous
>>> assignment before ??=, and thus end up to always have default value
>>> favored unless there're other direct assignments after ??=
>>> evaluation. Just touch the flag should be enough.
>>
>> Ah, yes, I need to check whether the value has been setVar before,
>> see following patch.
>>
>> This two lines are necessary in the following patch
>>
>> + if bb.data.getVarFlag(key, "content", data) is None:
>> + bb.data.setVar(key, None, data)
>>
>> because setVar will add the key into override list, which could not
>> be
>> achieved by just calling "setVarFlag". For the later formal patch, I
>> will add comments on the two lines.
>
> This is a little worrying and I think we have insight into a new bug
> here which is that if you just have a variable:
>
> foo_OVERA[bar] = "x"
>
> and foo is never set as a variable directly, the override is never
> expanded.
>
> There is a strong argument here to make setVar(...) a special case of
> setVarFlag(..., "content") although I worry about the performance
> implications.
>
> Chris: Any opinion?
>
> Cheers,
>
> Richard
More information about the poky
mailing list