Christian,

Note that executing within BaseX gui leads to different results, but seems
also to behave non linearly : for instance for $i in (15 to 20) return
prof:time(local:test1($i))
returns random results : for instance
Evaluating:
- 1368.54 ms
- 1314.6 ms
- 5151.12 ms
- 1719.01 ms
- 6023.38 ms
- 1996.37 ms

Might it be garbage collector stuff ?

2015-01-14 8:18 GMT+01:00 jean-marc Mercier <jeanmarc.merc...@gmail.com>:

> 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.gr...@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.merc...@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.gr...@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.merc...@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
>> >
>> >
>>
>
>

Reply via email to