| SAXONICA | 
A new method getProperties() has been added to the SequenceIterator
            interface. This allows the user of the iterator to determine properties of the iterator, such as whether the number
            of items in the iteration is known. Previously such properties could only be determined by testing the class of
            the iterator, which in some circumstances is not sufficiently fine-grained: the same class of iterator might sometimes
            support a property and sometimes not.
         
Following a suggestion from Wolfgang Hoschek, the Configuration now maintains a pool
            of parsers (XMLReader objects). Because initialization of a parser is typically expensive,
            this gives a significant improvement in the performance of
            parsing and tree-building when many documents are parsed under the control of the same Configuration,
            whether in the same thread or in different threads.
         
I have done some performance measurements to assess the impact of contention on the shared NamePool. This
            shows that synchronization on the allocate() method causes throughput of document construction
            to fall off when the concurrency gets above 10 or so. To eliminate this effect, the class
            ReceivingContentHandler now maintains a local cache of allocated name codes, so that when the same
            name appears repeatedly in an input document, the critical allocate() method is only invoked once.
            This removes the bottleneck. By removing the need to parse the lexical QName, this change also gives a
            (small) benefit when running a single-threaded transformation or query.
         
The document map maintained by the NamePool has been removed. This was being used only by the XOM interface, but was maintained for all documents (even temporary trees), with a potential cost in NamePool contention and in garbage collection time. XOM now maintains its own document map.