3

私のコードは遅すぎますが、それを改善する方法がわかりません。1kファイルのディスクからDOMへの読み取りには約20ミリ秒かかります。これはディスクによっては問題ない場合がありますが、xpathステートメントで作業するためにさらに20ミリ秒かかります。これは長すぎます。これは、時間コメント付きのサンプルコードです。どうすればコードを改善できますか?

これは建設時に起こります:

    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = this.dbFactory.newDocumentBuilder(); 
XPathExpression[] ex = new XPathExpression[]{about 30 different expressions}
XPathExpression mainEx =xPath.compile("/rootElement/firstLevel/secondLevel");

次に、コード:

Document doc = this.dBuilder.parse("somefile.xml");
//took 20 ms until here
NodeList nodes = (NodeList) mainEx .evaluate,doc, XPathConstants.NODESET);
 //took another 20 ms until here !!!
    for (int i = 0; i < nodes.getLength(); i++) {
    Node n = nodes.item(i);
    for (XPathExpression e:ex) {
         String v = (String) e.evaluate(n, XPathConstants.STRING);
        if (v != null) {
            System.out.println(v);
        }
    }
    }
    //this only takes 5 ms
4

2 に答える 2

5

あなたはおそらく、私がここに文書化したこの問題に苦しんでいます:

Java XPath (Apache JAXP 実装) のパフォーマンス

基本的に、Xalan の XPath 実装を大幅に高速化するには、次の JVM 引数を追加する必要があります。

-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
于 2012-01-26T11:39:51.117 に答える
4

XPathExpressionを使用して、XPath 式を にプリコンパイルする必要がありますXPath.compile。次に、 を呼び出しますXPathExpression.evaluate

これにより、複数回実行する場合に時間を節約できます。私はこれが事実であると仮定しています.20ミリ秒は問題ではありません。

編集:コメントで述べたように、この質問にはJVMパラメーターを含む詳細情報があります。

于 2011-11-27T10:46:38.233 に答える