|
[XQuery Talk Mailing List Archive Home] [By Date] [By Thread] [By Subject] [By Author] [Recent Entries] [Reply To This Message] Re: OptimizationsMichael Kay mike at saxonica.comFri Oct 3 16:27:01 PDT 2008
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: http://x-query.com/mailman/listinfo/talk [mailto:http://x-query.com/mailman/listinfo/talk] On Behalf Of Rémi Dewitte Sent: 03 October 2008 14:24 To: http://x-query.com/mailman/listinfo/talk Subject: 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 <http://x-query.com/mailman/listinfo/talk> 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/e3510ab1/attachment-0001.htm
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|






