Subject: RE: [xsl] XSLT 2.0 function - fastest node comparison From: "Andrew Welch" <ajwelch@xxxxxxxxxxxxxxx> Date: Thu, 10 Mar 2005 15:44:09 -0000 |
> You could experiment to see if reversing the conditions: > > $ranges/range[@to >=$char][@from <= $char] > > is any faster: this will only do one test on the ranges that > are too low, rather than two (assuming that Saxon searches in > forwards order, which it does). Still linear, but potentially > up to twice the speed. That's a very good tip! It does speed up the execution time by around 100ms just by swapping the predicates around. Out of interest, I've implemented a binary search function which works out slower than the sequential search, but this is probably due to the fact that there are only 94 ranges to compare against... <xsl:function name="f:isInRange" as="xs:boolean"> <xsl:param name="char" as="xs:integer"/> <xsl:param name="low" as="xs:double"/> <xsl:param name="high" as="xs:double"/> <xsl:variable name="middle" select="number(floor(($high - $low) div 2))" as="xs:double"/> <xsl:variable name="currentNode" select="$ranges/range[middle]"/> <xsl:sequence select="if ($currentNode[@from <= $char][@to >= $char]) then true() else if ($high > $low) then if ($char > $currentNode/@from) then f:isInRange($char, $middle, $high) else f:isInRange($char, $low, $middle) else false()"/> </xsl:function> I will use the linear search technique with the @to predicate test first as Mike suggested as that's fastest, but comments welcome on the function... Interestingly, using 'cast as' on $middle to narrow it to an integer causes the execution time to increase by 250ms, so I've left them all as doubles (the positional predicate in $currentNode doesn't appear to mind using a double). cheers andrew
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] XSLT 2.0 function - faste, Kirkham, Pete (UK) | Thread | RE: [xsl] XSLT 2.0 function - faste, Michael Kay |
[xsl] RTF from an html, gdilem\@libero\.it | Date | Re: [xsl] if condition, JBryant |
Month |