xsl-list
[Top] [All Lists]

Re: [xsl] Which is faster: count(/Document/A/B) eq 1 ... or ... /Document/A/(count(B) eq 1) ?

2012-09-20 09:48:39
So use the one that is most clear and that will make maintenance easier;-)


On Thu, Sep 20, 2012 at 1:11 AM, Michael Kay <mike(_at_)saxonica(_dot_)com> 
wrote:
Execution speed is a property of the XSLT implementation, not a property of
the language. You can't ask questions about performance without saying what
processor you are interested in.

With a trivial source document like this, it is very unlikely that any
performance difference will be measurable.

If there were a million B elements, some processors might (with either
expression) count all the elements and then ask whether a million is equal
to one. Other processors might (with either expression) stop at the second
element and realize that the count is not going to be equal to one. So
different processors might give very different performance from each other
(with either expression), varying by a factor of a million.

But then, if you parsed the source document containing a million B elements,
it's likely that parsing the document would take a lot longer than counting
the elements, so the performance difference including parsing cost might not
be so big after all.

If there were more than one A element, the two expressions would not be
equivalent, so asking whether one is faster than the other is irrelevant.
One of them will give the wrong answer.

Assuming you know there will always be one A, I would think that the most
consistent performance across processors would be achieved by writing
not(Document/A/B[2]). Of course, there's still a possibility that a very
naive processor would construct a node-set containing all the nodes in
Document/A/B, and then select the second of these nodes. There are no limits
to human stupidity.

Michael Kay
Saxonica

On 19/09/2012 14:34, Costello, Roger L. wrote:

Hi Folks,

Consider this XML document:

<Document>
     <A>
         <B>blah</B>
     </A>
</Document>

Here are two XPath expressions to test that there is exactly one <B>
element in the <A> element (assume there is only one <A> element):

1. count(/Document/A/B) eq 1

2. /Document/A/(count(B) eq 1)

Which is faster?

Is there an XPath expression, besides the ones listed, that is even better
and faster?

/Roger

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--