我有一个解析器,它解析和收集所需的字段并从中构造一个对象。假设如果 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 = (Node)xPath.evaluate(Name,xml,XPathConstants.NODE) 处获取节点值;
这里 xPath 是 XPath 类型的静态对象。当多次为产品调用上述函数时,后面的调用会花费很多时间,比如在开始时需要 2/3 毫秒,但后来(比如产品 300)每次调用需要 55-60 毫秒。
我可以在这里遗漏一些东西吗?谢谢!