我有一个解析器,它解析并收集require字段并从中构造一个对象。 假设xml如下所示
<xml>
<p1>
...
...
</p1>
<p2>
...
</p2>
...
...
</xml>
我的java代码解析它,代码如下所示。
for each product //p1,p2 etc..
print start time
parse that node, which returns a object
print end time
add the object to list.
示例代码位于
之下products = (NodeList) xPath.evaluate("/xml/product",pxml,XPathConstants.NODESET);
for (int i = 0; i < products.getLength(); i++)
{
System.out.println("parsing product ::"+i+":" + (System.currentTimeMillis()-time));
BookDataInfo _parsedPoduct = ParseProduct(products.item(i));
System.out.println("parsing product finished ::"+i+":" + (System.currentTimeMillis()-time));
if (_parsedPoduct.getParsingSucceeded())
{
pparsedProducts.add(_parsedPoduct);
}
}
我在解析节点之前打印了时间,之后,时间呈指数级增长,第一个产品的产品数量需要100毫秒,而第300个产品需要2000毫秒。 在每种情况下,执行相同的代码部分以进行解析。 任何人都知道为什么会这样吗?
我不能发布代码是什么parseproduct正在做什么,但发现时间消耗最多的地方。
private NodeList getNodelist(Node xml, String Name)
{
long time = System.currentTimeMillis();
System.out.println("Nodelist start::" + (System.currentTimeMillis() - time));
NodeList nodes = (NodeList)xPath.evaluate(Name,xml,XPathConstants.NODESET);
System.out.println("Nodelist end::" + (System.currentTimeMillis() - time));
return nodes;
}
类似于在stmt获取节点值 节点node =(Node)xPath.evaluate(Name,xml,XPathConstants.NODE);
这里xPath是XPath类型的静态对象。 当多次为产品调用上述功能时,后面的调用需要花费很多时间,比如在开始时需要2/3 ms但稍后(比如产品300)每次调用需要55-60ms。
我可能在这里错过一些东西吗? 谢谢!
答案 0 :(得分:0)
查看DOM和SAX解析之间的区别,DOM允许您查询XML文件,但必须将整个文档上传到内存中,如果您只想创建对象,最好使用SAX解析器
答案 1 :(得分:0)
问题解决了。 主要问题是下面链接中提到的问题。 XPath.evaluate performance slows down (absurdly) over multiple calls
按照上面提到的步骤,它大大减少了消耗的时间。