[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Increasing sequence ?

Subject: Re: Increasing sequence ?
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Fri, 27 Mar 2015 14:11:26 -0000
Re:  Increasing sequence ?
All said is correct.

I also think that the recursive function should qualify for guaranteed
streamable.

Is this correct?

As for Saxon not dealing in the best way with tail-recursion, I still
expect this issue to be fixed in the future -- would be very useful
and makes perfect sense.

Cheers,
Dimitre

On Fri, Mar 27, 2015 at 4:05 AM, Michael Kay mike@xxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
> What we're seeing here is that the best solution is radically influenced by
> the optimization strategies within the processor.
>
> Dimitre's recursive approach is only worth doing if the processor has
> non-constant performance for an expression of the form sequence[$N] where $N
> is an integer; that is, if sequences are implemented as linked lists rather
> than arrays. Saxon will generally use an adaptive implementation where the
> sequence is held as an array as soon as you start indexing into it, so the
> non-recursive solution will work just fine. Other systems may differ.
>
> Then, if you do use the recursive approach, you run into problems if the
> processor doesn't do tail-call optimization. And if that's the case, you
> need to consider a divide-and-conquer approach instead.
>
> Michael Kay
> Saxonica
> mike@xxxxxxxxxxxx
> +44 (0) 118 946 5893
>
>
>
>
> On 27 Mar 2015, at 09:36, Leo Studer leo.studer@xxxxxxxxxxx
> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Dimitre
>
> thanks, this is amazing. With Saxon EE in Oxygen 16.1 I get stack overflow
> with 10000 ;-).
> Can you compare the time with this solution?
> declare namespace my = "my:my";
> declare function my:increasing2($seq as xs:double*)as xs:boolean
> {every $v in 1 to (count($seq)-1) satisfies ($seq[$v] lt $seq[$v+1])};
> let $v:=(1 to 1000000) return (my:increasing2($v))
>
> Cheers
> Leo
>
> On 27.03.2015, at 05:24, Dimitre Novatchev dnovatchev@xxxxxxxxx
> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi Leo,
>
> I ran this with BaseX 7.8.2:
>
> declare namespace my = "my:my";
> declare function my:increasing($seq as xs:double*) as xs:boolean
> {empty($seq[2])
> or
>  $seq[1] lt $seq[2]  and  my:increasing(subsequence($seq, 2))
> };
> let $v:=(1 to 10000)
>  return my:increasing($v)
>
>
> And here is the result (do note this below: - marking as ***tail
> call***: my:increasing(fn:subsequence($seq_0, 2))  )
>
> Total Time: 3.74ms (for 100 000 - long sequence the time was 17.77ms,
> for 1 000 000 - long sequence the time was 207.56ms)
>
>
> XSL-List info and archive
> EasyUnsubscribe (by email)
>
>
> XSL-List info and archive
> EasyUnsubscribe (by email)

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.