Java XPath (Apache JAXP uygulama) performans
NOT: Eğer bu sorunla karşılaşırsanız, lütfen Apache JİRA üzerinde upvote:
Bu şaşırtıcı bir sonuca varıyorum:
Element e = (Element) document.getElementsByTagName("SomeElementName").item(0);
String result = ((Element) e).getTextContent();
İnanılmaz bir 100 kez daha hızlı gibi görünüyor:
// Accounts for 30%, can be cached
XPathFactory factory = XPathFactory.newInstance();
// Negligible
XPath xpath = factory.newXPath();
// Negligible
XPathExpression expression = xpath.compile("//SomeElementName");
// Accounts for 70%
String result = (String) expression.evaluate(document, XPathConstants.STRING);
JAXP bu JVM varsayılan uygulama kullanıyorum:
org.apache.xpath.jaxp.XPathFactoryImpl
org.apache.xpath.jaxp.XPathImpl
Gerçekten kolay JAXP yukarıda XPath sorgusu aslında getElementsByTagName()
basit yerine çalıştırmak için optimize nasıl görmek için, çünkü kafam karıştı. Ama bunu yapmak için görünmüyor. Bu problemi ve API tarafından çekilen gizli sık kullanılan XPath aramalar, yaklaşık 5-6 sınırlıdır. Bu sorguları basit yolları (*13 örneğin*, değişkenler, koşullar) her zaman kullanılabilir bir DOM Belgesi sadece karşı içerir. Eğer bir optimizasyon yapılabilir, çok kolay elde edilecek.
Benim sorum: XPath bu yavaşlık kabul edilen bir gerçektir, falan bakan ben miyim? (Daha hızlı) daha iyi bir uygulama var mı? Ya ben sadece XPath tamamen, basit sorgular için kaçınmalısınız?
CEVAP
Ve-örnek testi ve/Xalan JAXP genel olarak benim debug profilli var. Büyük büyük sorunu tespit ettim
org.apache.xml.dtm.ObjectFactory.lookUpFactoryClassName()
10k test XPath değerlendirmeler her bir classloader varsayılan yapılandırma çeşit DTMManager
örnek arama için çalışırken led görülebilir. Bu yapılandırma belleğe yüklü değil ama her zaman erişilebilir. Ayrıca, bu erişim ObjectFactory.class
kendisini bir kilit tarafından korunuyor gibi görünüyor. Erişim başarısız (varsayılan), o zaman yapılandırma xalan.jar
dosya yüklenir
META-INF/service/org.apache.xml.dtm.DTMManager
yapılandırma dosyası.Her zaman!:
Neyse ki, bu davranış, bu gibi JVM parametresi belirterek kılınabilir:
-Dorg.apache.xml.dtm.DTMManager=
org.apache.xml.dtm.ref.DTMManagerDefault
ya
-Dcom.sun.org.apache.xml.internal.dtm.DTMManager=
com.sun.org.apache.xml.internal.dtm.ref.DTMManagerDefault
Yukarıda ise fabrika sınıf adı varsayılan her neyse eğer bu lookUpFactoryClassName()
pahalı eser atlamasına izin verir gibi çalışır:
// 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
İşte 90 kalibre karşı //SomeNodeName
10k üst üste XPath değerlendirme için performans geliştirme genel bakış XML dosyası (System.nanoTime()
ile ölçülür
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 |
kriter çok ilkel olduğunu unutmayın. Peki kendi kriter Sakson xalan daha iyi performans gösteriyor olabilir
Apache: Xalan çocuklar için bir hata olarak bulundular
Java'da örneğin kullanarak performans ...
İyi uygulama java kullanmaktır.lang.St...
&; Java Uygulama Eşzamanlılık" ha...
C standart iostreams için düşük perfor...
'In String Java kullanmalıyım.eğe...