[xquery-talk] Re: Optimizations

Rémi Dewitte remi at gide.net
Fri Oct 3 17:38:28 PDT 2008


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/a0be439a/attachment.htm


More information about the talk mailing list