必要なフィールドを解析して収集し、そこからオブジェクトを構築するパーサーがあります。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 ミリ秒かかりました。
ここで何か足りないことがありますか?ありがとう!