Glory to our holy Leo for transmitting *brahmavidya* to shishya !!
Turning back to this optimization problem, this might be trickier since execution time does not seem to behave linearly. For instance, consider
declare function local:test1($i){let $data_3 as item() *:= fn:for-each((1 to 1000000*$i), function($a_0) as item()? { (2 * $a_0) }) return for $n in (1 to 2) return fn:count($data_3)}; declare function local:test2($i){count(fn:for-each((1 to 1000000*$i), function($a_0) as item()? { (2 * $a_0) }))};
Then execution time is ( the results are stable while repeating the experience )
prof:time(local:test1(7)) : 631.32 ms prof:time(local:test2(7)) : 451.32 ms prof:time(local:test1(8)) : 2550.17 ms prof:time(local:test2(8)) : 507.32 ms
2015-01-13 22:43 GMT+01:00 Christian Grün christian.gruen@gmail.com:
Hi Jean-Marc,
beforehand: The first issue you reported back to us recently [1] has been fixed by our functional guru Leo! A new snapshot is available [2].
Hi. Thanks for the FLWOR trick, behaving in constant time. However it
seems
to generates an unexpected 5X time overhead
Most probably this is because the results of for-each will be cached, while in the previous case (if no inlining takes place), all items will be iterated.
Hope this helps, Christian
[1] https://github.com/BaseXdb/basex/issues/1052 [2] http://files.basex.org/releases/latest/
On Tue, Jan 13, 2015 at 9:19 AM, jean-marc Mercier jeanmarc.mercier@gmail.com wrote:
Christian,
Hi. Thanks for the FLWOR trick, behaving in constant time. However it
seems
to generates an unexpected 5X time overhead, and I can't use it straightforwardly as workaround. Can you reproduce it, since this
overhead
might be due to eclipse ?
declare function local:test(){fn:for-each(1 to 10000000, function($a){2*$a})}; declare function local:test1(){count(local:test())}; declare function local:test2(){let $ data := local:test() return for $n
in
(1 to 10) return count($data)};
prof:time(local:test1()) ouput : 639.12 ms prof:time(local:test2()) ouput : 2431.67 ms
2015-01-13 1:59 GMT+01:00 Christian Grün christian.gruen@gmail.com:
Hi Jean-Marc,
interesting one; it seems that $data is inlined and thus evaluated more than once. This doesn't happen if a FLWOR expression is used:
let $data := fn:for-each ... for $n in 1 to $i return local:test2($data, $n)
Should be easy to resolve.
Thanks for your (always concise) examples, Christian
On Mon, Jan 12, 2015 at 9:08 PM, jean-marc Mercier jeanmarc.mercier@gmail.com wrote:
Hello,
I am facing some performances issues, probably due to unexpected query reevaluation. Might it be due to the optimizer ? Here is a code to
test
declare function local:test($i){ let $data := fn:for-each(1 to 10000000, function($a){2*$a} ) (: let $data := xquery:eval("fn:for-each(1 to 10000000, function($a){2*$a} )") :) return (1 to $i) ! local:test2($data,.) };
declare function local:test2($data, $dummy) { count($data) };
(1 to 10) ! prof:time(local:test(.))
Output :
683.76 ms 1137.95 ms 1727.68 ms 2151.06 ms 2694.84 ms 3189.57 ms 3725.1 ms 4277.51 ms 4815.74 ms 5417.79 ms
Note that using xquery:eval (toggling the comment inside local:test). seems to perform correctly. However I can't use this trick as a workaround.
(1 to 10) ! prof:time(local:test(.)) Ouput :
2472.71 ms 825.61 ms 3013.14 ms 986.81 ms 2982.97 ms 778.24 ms 1195.33 ms 3280.7 ms 976.96 ms 913.69 ms