[xquery-talk] Re: Optimizations

Rémi Dewitte remi at gide.net
Fri Oct 3 18:13:03 PDT 2008


To be honest this is this kind of feature (like differed evaluation of
variables) I really like in XQuery and specifically in saxon. It allows a
logging module without paying any runtime penalty if a level is disabled.
With the limit of not being able to change logging level at runtime but I am
ok with that.

Rémi

On Fri, Oct 3, 2008 at 4:50 PM, Michael Kay <mike at saxonica.com> wrote:

>  It's now handling this case. It was actually doing the final optimization
> pass, the problem was that the "compareToInteger" expression, which is only
> introduced by the optimizer in a previous phase, wasn't being recognized as
> a candidate for further rewrite when the second operand became constant.
>
> Optimizers only improve by trying them out on new test cases, so it's
> always good to get feedback like this.
>
> Michael Kay
> http://www.saxonica.com/
>
>  ------------------------------
> *From:* remidewitte at gmail.com [mailto:remidewitte at gmail.com] *On Behalf Of
> *Rémi Dewitte
> *Sent:* 03 October 2008 15:38
> *To:* Michael Kay
> *Cc:* talk at x-query.com
> *Subject:* Re: [xquery-talk] Re: Optimizations
>
>  Thanks Michael for these explanations,
> It is very good to know these details. And a good motivation to buy
> Saxon-SA.
>
> Rémi
>
> On Fri, Oct 3, 2008 at 4:27 PM, Michael Kay <mike at saxonica.com> wrote:
>
>>  This is a case where Saxon (even Saxon-SA) has stopped optimizing when
>> it could have achieved a little more. The relevant part of the final
>> expression tree is
>>
>>      <return>
>>         <sequence>
>>           <choose>
>>             <when>
>>               <compareToInteger op="ge" value="4">
>>                 <literal value="3" type="xs:integer"/>
>>               </compareToInteger>
>>             </when>
>>             <then>
>>               <directElement name="debug" validation="preserve">
>>                 <variableReference name="dosmthg"/>
>>               </directElement>
>>             </then>
>>           </choose>
>>           <variableReference name="dosmthg"/>
>>         </sequence>
>>       </return>
>>
>> and it hasn't noticed that the <when> condition is now constant.
>>
>> Deciding when to stop optimizing is the trickiest part of the exercise -
>> if you go on too long, optimization can take longer than any run-time
>> savings it is delivering. In this occasion, two more passes would have paid
>> dividends - one to evaluate the <when> condition, the other to reduce the
>> <choose> to ().
>>
>> Michael Kay
>> http://www.saxonica.com/
>>
>>
>>
>>  ------------------------------
>>  *From:* talk-bounces at x-query.com [mailto:talk-bounces at x-query.com] *On
>> Behalf Of *Rémi Dewitte
>> *Sent:* 03 October 2008 14:24
>> *To:* talk at x-query.com
>> *Subject:* [xquery-talk] Re: Optimizations
>>
>>   Hi again,
>>
>> In the same spirit, this is not at all optimized.
>> Maybe I need Saxon SA ?
>>
>>
>> declare variable $level as xs:integer := 3 ;
>>
>> declare function local:debug($l as xs:integer,$what){
>>   if($l >=4) then
>>     <debug>{$what}</debug>
>>   else ()
>> };
>>
>> let $dosmthg := <oki>test trace</oki>
>>
>> return
>> (local:debug($level,$dosmthg),$dosmthg)
>>
>>
>> Rémi
>>
>> On Fri, Oct 3, 2008 at 3:17 PM, Rémi Dewitte <remi at gide.net> wrote:
>>
>>> Hi,
>>>
>>> I have made a little experiment after reading Michael (Kay) blog posts
>>> about optimizations and recent James Fuller article.
>>>
>>> I have a question quite specific to saxon still interesting in general.
>>>
>>> Why in the following example even the function call is not skipped ?
>>>
>>>
>>> XQuery is ::
>>>
>>> declare variable $level := 3;
>>>
>>> declare function local:debug($what){
>>>   if($level >=4) then
>>>     <debug>{$what}</debug>
>>>   else ()
>>> };
>>>
>>> let $dosmthg := <oki>test trace</oki>
>>>
>>> return
>>> (local:debug($dosmthg),$dosmthg)
>>>
>>> When I run saxon with -explain we get
>>>
>>> <query>
>>>   <globalVariables>
>>>     <declareVariable name="level">
>>>       <literal value="3" type="xs:integer"/>
>>>     </declareVariable>
>>>   </globalVariables>
>>>   <declareFunction name="local:debug" tailRecursive="false">
>>>     <literal value="()"/>
>>>   </declareFunction>
>>>   <body>
>>>     <let variable="dosmthg" as="element(oki, {
>>> http://www.w3.org/2001/XMLSchema}untyped<http://www.w3.org/2001/XMLSchema%7Duntyped>
>>> )">
>>>       <be>
>>>         <directElement name="oki" validation="skip">
>>>           <valueOf>
>>>             <literal value="test trace" type="xs:string"/>
>>>           </valueOf>
>>>         </directElement>
>>>       </be>
>>>       <return>
>>>         <sequence>
>>>           <functionCall name="local:debug" tailCall="false">
>>>             <variableReference name="dosmthg"/>
>>>           </functionCall>
>>>           <variableReference name="dosmthg"/>
>>>         </sequence>
>>>       </return>
>>>     </let>
>>>   </body>
>>> </query>
>>>
>>> Cheers,
>>> Rémi
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://x-query.com/pipermail/talk/attachments/20081003/e2cf1db5/attachment.htm


More information about the talk mailing list