In this case it would be useless : it appears that the optimized query consists in dumping this big map (about 400 000 000 integers), consisting in several Giga octets of data when serialized.
True, this doesn't always make sense (my comment was mostly pointing to your observation "The suspected reason is that inlining is not activated in try catch expression." on the query you sent to us).
2015-01-17 18:27 GMT+01:00 Christian Grün christian.gruen@gmail.com:
Hi Jean-Marc,
Note that this analysis is quite difficult to do because I can't use xquery info view for my "real" queries : the gui is freezing. It appears that it is trying to dump an enormous map with which I am working.
You can also print the query info with the command-line flag -V.
Hope this helps, C.
declare function local:test($i){fn:for-each(1 to $i, function($a){2*$a})}; declare function local:fun-profile($fun,$args) {try{$fun($args)} catch *{()}}; declare function local:fun-profile2($fun,$args) {$fun($args)};
prof:time(count(local:fun-profile(local:test#1, 10000000))) : 843.18 ms (with BaseX gui)
2015-01-17 17:00 GMT+01:00 Christian Grün christian.gruen@gmail.com:
Hi Jean-Marc,
This time, it was not that obvious to run your query (I stlil didn't find local:call). But my guess is that the try/catch query is simply slower, because catching errors simply takes time. I invite you to look into the info view; it will show you what is inlined and what is not.
Best, Christian
On Sat, Jan 17, 2015 at 3:40 PM, jean-marc Mercier jeanmarc.mercier@gmail.com wrote:
Hello,
To complete the previous threads :
- I forgot a definition : declare function local:call($fun,$args)
{$fun($args)}; 2) The same behavior seems to occurs with the following code, not involving try catch expression :
declare function local:test($i){fn:for-each(1 to $i, function($a){2*$a})}; declare variable $test := prof:time(local:test(10000000),false(),"2 :"); prof:time(count(local:test(10000000)),false(),"1 :"),count($test)
Output : 2 :2508.42 ms 1 :710.51 ms
2015-01-17 13:27 GMT+01:00 jean-marc Mercier jeanmarc.mercier@gmail.com:
Hello all,
I wrote some basic debugging / profiling tools for xquery code, using try{} catch *{} mechanisms. However, profiling tools are not reliable.
The suspected reason is that inlining is not activated in try catch expression. If confirmed, is it a desired behavior ?
Here is the basic test :
declare function local:test($i){fn:for-each(1 to $i, function($a){2*$a})}; declare function local:fun-profile($fun,$args) {try{local:call($fun,$args)} catch *{()}}; declare function local:fun-profile2($fun,$args) {local:call($fun,$args)};
With default options (ie inlining activated)
prof:time(count(local:fun-profile2(local:test#1, 10000000))) Output : 683.12 ms prof:time(count(local:fun-profile(local:test#1, 10000000))) Output : 2465.47 ms
With inlining desactivated (ie INLINELIMIT=0) prof:time(count(local:fun-profile2(local:test#1, 10000000))) Output : 2480.32 ms