3

次の 2 つのコード セグメントは同じことを行いますが、1 つは式をコンパイルし、もう 1 つは式を評価するだけです。

    //1st option - compile and run

    //make the XPath object compile the XPath expression
    XPathExpression expr = xpath.compile("/inventory/book[3]/preceding-sibling::book[1]");
    //evaluate the XPath expression
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    nodes = (NodeList) result;
    //print the output
    System.out.println("1st option:");
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println("i: " + i);
        System.out.println("*******");
        System.out.println(nodeToString(nodes.item(i)));
        System.out.println("*******");
    }


    //2nd option - evaluate an XPath expression without compiling

    Object result2 = xpath.evaluate("/inventory/book[3]/preceding-sibling::book[1]",doc,XPathConstants.NODESET);
    System.out.println("2nd option:");
    nodes = (NodeList) result2;
    //print the output
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println("i: " + i);
        System.out.println("*******");
        System.out.println(nodeToString(nodes.item(i)));
        System.out.println("*******");
    }

出力はまったく同じです。コンパイルと単に評価することの違いは何ですか? 式をコンパイルする/コンパイルしないのはなぜですか?

4

3 に答える 3

1

2 番目evaluateも式を暗黙的にコンパイルしますが、評価の直後にコンパイル済みのフォームを破棄します。あなたの例では、式を一度しか使用しないため、これは何の違いもありません。

ただし、式を複数回使用する場合は、一度コンパイルしてコンパイル済みのフォームを複数回再利用すると、毎回再コンパイルする場合に比べて処理時間を大幅に節約できます。

于 2013-04-12T11:26:32.410 に答える
0

xpath のコンパイルには時間がかかります。xpath.evaluate呼び出すたびに xpath をコンパイルします。プリコンパイル済みの式を使用すると、パフォーマンスが向上します。

于 2013-04-12T11:23:30.790 に答える