[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