Оптимизация кода DOM и XPath Java - PullRequest
3 голосов
/ 27 ноября 2011

Мой код слишком медленный, но я не уверен, как его улучшить.Чтение с диска в DOM для 1k-файла занимает около 20 мс, что может быть хорошо в зависимости от диска, но затем у меня есть еще 20 мс для работы с оператором xpath, что слишком много.Вот пример кода с комментариями.Как я могу улучшить код?

Это происходит во время строительства:

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = this.dbFactory.newDocumentBuilder(); 
XPathExpression[] ex = new XPathExpression[]{about 30 different expressions}
XPathExpression mainEx =xPath.compile("/rootElement/firstLevel/secondLevel");

Тогда код:

Document doc = this.dBuilder.parse("somefile.xml");
//took 20 ms until here
NodeList nodes = (NodeList) mainEx .evaluate,doc, XPathConstants.NODESET);
 //took another 20 ms until here !!!
    for (int i = 0; i < nodes.getLength(); i++) {
    Node n = nodes.item(i);
    for (XPathExpression e:ex) {
         String v = (String) e.evaluate(n, XPathConstants.STRING);
        if (v != null) {
            System.out.println(v);
        }
    }
    }
    //this only takes 5 ms

Ответы [ 2 ]

4 голосов
/ 27 ноября 2011

Вы должны предварительно скомпилировать выражение XPath в XPathExpression, используя XPath.compile.Затем позвоните XPathExpression.evaluate.

. Это сэкономит ваше время, если вы выполните его более одного раза.Я предполагаю, что это так, или 20 мс не должны иметь значения.

РЕДАКТИРОВАТЬ: Как уже упоминалось в комментариях, этот вопрос содержит дополнительную информацию, включая параметр JVM.

3 голосов
/ 26 января 2012

Возможно, вы страдаете от этой проблемы, которую я задокументировал здесь:

Производительность Java XPath (реализация Apache JAXP)

По сути, вы должны добавить эти аргументы JVM, чтобы значительно ускорить реализацию XPal в Xalan:

-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
...