Ответ 1
Я отлаживал и профилировал свой тестовый сценарий и Xalan/JAXP в целом. Мне удалось определить большую серьезную проблему в
org.apache.xml.dtm.ObjectFactory.lookUpFactoryClassName()
Можно видеть, что каждая из тестов XPath test XPath привела к загрузчику классов, пытающимся найти экземпляр DTMManager
в некоторой конфигурации по умолчанию. Эта конфигурация не загружается в память, но доступна каждый раз. Кроме того, этот доступ, по-видимому, защищен блокировкой самого ObjectFactory.class
. Когда сбой доступа (по умолчанию), конфигурация загружается из xalan.jar
файла
META-INF/service/org.apache.xml.dtm.DTMManager
конфигурационный файл. Каждый раз!:
К счастью, это поведение можно переопределить, указав параметр JVM следующим образом:
-Dorg.apache.xml.dtm.DTMManager=
org.apache.xml.dtm.ref.DTMManagerDefault
или
-Dcom.sun.org.apache.xml.internal.dtm.DTMManager=
com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault
Вышеупомянутое работает, так как это позволит обойти дорогостоящую работу в lookUpFactoryClassName()
, если имя класса factory по умолчанию равно:
// Code from com.sun.org.apache.xml.internal.dtm.ObjectFactory
static String lookUpFactoryClassName(String factoryId,
String propertiesFilename,
String fallbackClassName) {
SecuritySupport ss = SecuritySupport.getInstance();
try {
String systemProp = ss.getSystemProperty(factoryId);
if (systemProp != null) {
// Return early from the method
return systemProp;
}
} catch (SecurityException se) {
}
// [...] "Heavy" operations later
Итак, вот обзор улучшения производительности для 10k последовательных оценок XPath //SomeNodeName
в файле 90k XML (измеряется с помощью System.nanoTime()
:
measured library : Xalan 2.7.0 | Xalan 2.7.1 | Saxon-HE 9.3 | jaxen 1.1.3
--------------------------------------------------------------------------------
without optimisation : 10400ms | 4717ms | | 25500ms
reusing XPathFactory : 5995ms | 2829ms | |
reusing XPath : 5900ms | 2890ms | |
reusing XPathExpression : 5800ms | 2915ms | 16000ms | 25000ms
adding the JVM param : 1163ms | 761ms | n/a |
Обратите внимание, что эталонный тест был очень примитивным. вполне возможно, что ваш собственный тест покажет, что саксон превосходит xalan
Я зарегистрировал это как ошибку для парней Xalan в Apache: