Мне нужно проверить только один узел из каждого файла (109 файлов), который хранится на разных URL-адресах (109 URL-адресов). Я использую этот код
public class XPathParserXML {
public String version(String link, String serial) throws SAXException, IOException,
ParserConfigurationException, XPathExpressionException{
String version = new String();
String url = link+serial;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(url);
XPath xPathFactory = XPathFactory.newInstance().newXPath();
XPathExpression expr = xPathFactory.compile("//swVersion/text()");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList node = (NodeList) result;
if (node == null){
version = "!!WORKING!!";
}else{
version = node.item(0).getNodeValue();
}
return version;
}
}
и я вызываю метод "версия (ссылка, серийный)" в cicle в 109 раз
Мой код занимает 20 секунд, чтобы разработать все. Каждый размер файла 0.64 КБ и у меня есть соединение 20 МБ.
Что я могу сделать, чтобы ускорить мой код?
Хотя это не единственная проблема, возможно, вы должны обязательно кэшировать и повторно использовать все эти объекты между вызовами version()
:
DocumentBuilderFactory
DocumentBuilder
XPathFactory
XPathExpression
Кроме того, вы должны, вероятно, активировать один из этих флагов:
-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
См. Также этот вопрос:
Выполнение Java XPath (реализация Apache JAXP)
И последнее, но не менее важное: вы последовательно обращаетесь ко всем этим файлам XML через провод. Может оказаться полезным уменьшить влияние задержек вашего соединения путем параллельного доступа к этим файлам, например, используя несколько потоков на стороне клиента. (Обратите внимание, что если вы выбираете многопоточность, тогда остерегайтесь проблем безопасности потоков при кешировании объектов, о которых я упоминал в первом разделе. Также избегайте одновременного создания слишком большого количества параллельных запросов, чтобы предотвратить сбой вашего сервера)
Другим способом уменьшить это воздействие было бы разоблачение этих XML файлов в ZIP файле с сервера, чтобы избежать множественных подключений и сразу передать все файлы XML.
Из ваших дополнительных комментариев я вижу, что вы используете проверку XML. Это, конечно, дорого и должно быть сделано только в случае необходимости. Так как вы запускаете очень произвольное выражение XPath, я полагаю, что вы не слишком заботитесь о проверке XML. Лучше выключите его!
Поскольку (из ваших комментариев) вы измерили разбор, чтобы использовать большую часть процессора, у вас есть еще два варианта, чтобы обойти всю проблему:
//swVersion
(из вашего кода я предполагаю, что есть только один). SAX намного быстрее для этих прецедентов, чем DOM.<swVersion>(.*?)</swVersion>
. Это должно быть только ваше последнее средство, потому что оно не справляется