我有一个解析器,它解析和收集所需的字段,并从其中构造一个对象。假设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);
}
}我已经打印了解析节点之前的时间,在那之后,随着no.of产品的成倍增长,比如第一种产品需要100 as,当第300位产品花费2000 as时,时间就会呈指数增长。在每种情况下,都会执行相同部分的代码进行解析。有人知道为什么会发生这种事吗?
我不能发布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 )xPath.evaluate(Name,xml,XPathConstants.NODE)处获取节点值;
这里,XPath是xPath类型的静态对象。当对一个产品多次调用上述函数时,后面的调用会花费很长时间,比如在开始时需要2/3 ms,但是稍后(例如产品300),每次调用需要55-60ms。
我可以在这里漏掉一些东西吗?谢谢!
发布于 2013-11-08 11:09:40
问题解决了。主要问题是在下面的链接中提到的问题。XPath.evaluate performance slows down (absurdly) over multiple calls
按照上面提到的步骤,它大大减少了所消耗的时间。
发布于 2013-11-07 07:28:25
检查DOM和SAX解析之间的区别,DOM允许您查询XML文件,但必须将整个文档上传到内存中,如果您只想创建对象,最好使用SAX解析器。
https://stackoverflow.com/questions/19830080
复制相似问题