2013-04-12 3 views
0

У меня есть следующие два сегмента кода, которые делают то же самое, за исключением того, что один компилирует выражение, а одно просто оценивает его.Зачем компилировать выражение XPath?

//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("*******"); 
    } 

Выходной сигнал точно такой же. В чем разница между компиляцией и просто оценкой? Зачем компилировать/не компилировать выражение?

+0

Если вы используете один и тот же xpath снова и снова, скомпилируйте его, чтобы сэкономить время. Если вы используете разные xpath каждый раз, когда вы идете (например, вы генерируете его на лету), нет смысла компилировать. – shakurov

ответ

5

Компиляция выражения XPath сохраняет его в формате, который может быть использован немедленно. При оценке выражения также компилируется, но скомпилированный результат впоследствии отбрасывается.

Компиляция рекомендуется, если одно и то же выражение используется снова и снова, например, в цикле.

0

Компиляция xpath требует времени. xpath.evaluate компилирует xpath каждый раз, когда вы его вызываете. Использование предварительно скомпилированных выражений повышает производительность.

+0

Хорошо, так почему я должен компилировать? Это разница действительно, но не основная ... – Jjang

+0

Как говорили люди, единственная причина для компиляции выражения - улучшить производительность, если вы собираетесь использовать одно и то же выражение более одного раза. –

1

Второй evaluate неявно компилирует это выражение, но сбрасывает скомпилированную форму сразу после оценки. В вашем примере это не имеет никакого значения, поскольку вы используете выражение только один раз.

Но если вы используете выражение более одного раза, компиляция его один раз и повторное использование скомпилированной формы несколько раз может сэкономить значительное количество времени обработки по сравнению с повторной компиляцией ее каждый раз.

Смежные вопросы