[jdom-interest] Presences of Namespace dramatically slows SAXBuilder
Joseph Bowbeer
jozart at csi.com
Tue Apr 3 16:11:13 PDT 2001
Here's a micro-optimization that might make a difference:
I notice that SAXBuilder.startElement always calls transferNamespaces. I'm
not sure how much work transferNamespaces typically has to do, but it can be
written much more efficiently if we added a protected "bulk" namespace
method to Element.
Here's the old version:
private void transferNamespaces(Element element) {
Iterator i = declaredNamespaces.iterator();
while (i.hasNext()) {
Namespace ns = (Namespace)i.next();
i.remove();
availableNamespaces.addFirst(ns);
element.addNamespaceDeclaration(ns);
}
}
Here's a new version that uses addAll and clear, which saves creating an
Iterator and doing individual adds and removes:
private void transferNamespaces(Element element) {
if (!declaredNamespaces.isEmpty()) {
availableNamespaces.addAll(0, declaredNamespaces);
element.addNamespaceDeclarations(declaredNamespaces);
declaredNamespaces.clear();
}
}
The code above requires that we add a new protected method to Element:
protected void addNamespaceDeclarations(Collection namespaces) {
if (additionalNamespaces == null) {
additionalNamespaces = new LinkedList();
}
additionalNamespaces.addAll(namespaces);
}
Misc. Notes:
1. Replace LinkedList with ArrayList? LinkedList is rarely more efficient
than ArrayList, especially when bulk-mode operations can be used.
2. Is "!isEmpty()" more readable than "size() > 0"?
3. Element.getAdditionalNamespaces is a little strange. If there are no
additional namespaces, it returns Collections.EMPTY_LIST, which is static
and immutable. However, if there are additional namespaces, it returns the
actual list, which is mutable.
--
Joe Bowbeer
----- original message -----
From: Jason Hunter jhunter at acm.org
Date: Tue, 03 Apr 2001 12:52:08 -0700
On the SAX side: Priming alone didn't bring the SAX build in line, so I
did a little OptimizeIt testing and found that one line was taking the
vast bulk of time:
availableNamespaces.remove(element.getAdditionalNamespaces());
I changed it to:
List addl = element.getAdditionalNamespaces();
if (addl.size() > 0) {
availableNamespaces.remove(addl);
}
And now what did take 13219ms now takes 580ms (on Xerces). Quite a
change, and right in line with the no-NS build that takes 470ms. I'll
be checking in the enhancement after this.
More information about the jdom-interest
mailing list