Avatar billede it-dyret Nybegynder
16. september 2008 - 13:42 Der er 6 kommentarer og
1 løsning

Hastighed på XPath

Hej, jeg sidder og roder med at optimere gammel kode, nærmere bestemt gammel "manuel" iteration af XML med XPath, men det viser sig, at den gamle kode er markant hurtigere. Hvad er grunden til det?

Her ses et lille men komplet eksempel:

public class XPathFun {

  /* Eksempel på xml
    <Language>
      <Group name="General">
        <String name="Ok">Ok</String>
        <String name="Cancel">Annuller</String>
      </Group>
      <Group name="Login">
        <String name="Username">Brugernavn</String>
        <String name="Password">Adgangskode</String>
      </Group>
    </Language>
  */

  public static void main(String[] args) throws Exception {
    System.out.println(getStringByDOM("General", "Cancel"));
    System.out.println(getStringByXPath("General", "Cancel"));
  }
   
  private static String getStringByXPath(String group, String key) throws Exception{
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse("C:\\Temp\\Dansk.xml");
   
    String xpathSelector = "//Language/Group[@name='" + group + "']/String[@name='" + key + "']/text()";
    XPath xpath = XPathFactory.newInstance().newXPath();
    try {
      Node node = (Node)xpath.evaluate(xpathSelector, doc.getDocumentElement(), XPathConstants.NODE);
      if(node != null) {
        return node.getNodeValue();
      }
    }
    catch(XPathExpressionException e) {
      e.printStackTrace();
    }
   
    return key;
  }
 
  private static String getStringByDOM(String group, String key) throws Exception {
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse("C:\\Temp\\Dansk.xml");
 
    NodeList elements = doc.getElementsByTagName("Group");
    for(int i=0; i < elements.getLength(); i++){
      String groupCandidate = elements.item(i).getAttributes().item(0).getTextContent();
      if(groupCandidate.equals(group)){       
        NodeList children = ((Element)elements.item(i)).getElementsByTagName("String");
        for(int c=0; c < children.getLength(); c++){
          String stringCandidate = children.item(c).getAttributes().item(0).getTextContent();
          if(stringCandidate.equals(key)){
            return children.item(c).getTextContent();
          }         
        }
      }
    }
   
    return key;
  }
}
Avatar billede it-dyret Nybegynder
16. september 2008 - 13:44 #1
I den konkrete applikation er der omkring en faktor 10 til forskel på, om jeg lader den gamle kode foretage opslag ved sprogskifte, eller om jeg bruger XPath koden til det...
Avatar billede arne_v Ekspert
16. september 2008 - 13:50 #2
XPath er lidt halv dyrt. Foerst skal den parse xpath strengen. Saa skal den lave det samme
som din DOM kode goer - bare med dynamisk soege info.

Det koster noget.

Men medmindre XML parsning er en meget stor del af ens applikation, saa prioriterer man
det at koden er nemmere at vedligeholde over CPU forbruget.
Avatar billede arne_v Ekspert
16. september 2008 - 14:07 #3
Avatar billede it-dyret Nybegynder
16. september 2008 - 15:18 #4
Jeg har gennemlæst dit link, og hvor det ellers førte mig hen, og er blevet en del klogere på problemmatikken.

Tak for indsigten.

Smid et svar, så smider jeg point
Avatar billede arne_v Ekspert
16. september 2008 - 15:20 #5
svar
Avatar billede arne_v Ekspert
16. september 2008 - 15:21 #6
Og som sagt: vent med at skrive mere optimeret kode indtil du ved at det faktisk
betyder noget for den samlede performance.
Avatar billede it-dyret Nybegynder
16. september 2008 - 15:24 #7
Dit råd er hermed skrevet bag øret, jeg takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester