2013-05-03 4 views
2

Я пытался измерить время, необходимое для StAX и DOM, чтобы создать два одинаковых документа. Я не знаю, почему DOM быстрее создает XML. Возможно, мой код для писателя StAX не очень хорош. так вот она StAX (больше кода)Почему StAX создает XML медленнее, чем DOM?

public static final int pocet =100000; 

try { 

    String encoding = "UTF-8"; 
    XMLOutputFactory f = XMLOutputFactory.newInstance(); 
    XMLStreamWriter w = f.createXMLStreamWriter(
         new FileOutputStream(subor), 
         encoding); 
    w.writeStartDocument(encoding, "1.0"); 
    w.writeCharacters("\r\n"); 
    w.writeStartElement("Noviny");   
    for (int i = 1; i <= pocet; i++) { 
    w.writeCharacters("\r\n "); 
    w.writeStartElement("Autor"); 
    w.writeCharacters("\r\n "); 
    w.writeStartElement("Id"); 
    String ID = Integer.toString(i); 
    w.writeCharacters(ID); 
    w.writeEndElement(); 
    w.writeCharacters("\r\n "); 
    w.writeStartElement("Meno"); 
    w.writeCharacters("Autor"+i); 
    w.writeEndElement(); 
    w.writeCharacters("\r\n "); 
    w.writeStartElement("Email"); 
    w.writeCharacters("Autor"+i+"@email.com"); 
    w.writeEndElement(); 
    w.writeCharacters("\r\n "); 
    w.writeStartElement("Tel_cislo"); 
    w.writeAttribute("typ", "pevna"); 
    w.writeCharacters("+4219"); 
    w.writeEndElement(); 
    w.writeCharacters("\r\n "); 
    w.writeStartElement("plat"); 

    w.writeCharacters("5000"); 
    w.writeEndElement(); 
    w.writeCharacters("\r\n ");   
    w.writeEndElement(); 
    w.writeCharacters("\r\n"); 



    } 
    w.writeCharacters("\r\n"); 
    w.writeEndElement();   
    w.writeCharacters("\r\n"); 
    w.writeEndDocument(); 
    w.close(); 



} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

DOM

 int pocet =1500000; 
try { 
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = dfactory.newDocumentBuilder(); 
DOMImplementation domImpl = builder.getDOMImplementation(); 
Document document = domImpl.createDocument(null, "Noviny", null); 
Node noviny = document.getDocumentElement(); 
for(int i = 0; i<pocet ; i++) { 
Element autor = document.createElement("autor"); 
Element meno = document.createElement("meno"); 
Element id = document.createElement("id"); 
Element email = document.createElement("email"); 
Element tel = document.createElement("tel_cislo"); 
    Element plat = document.createElement("plat"); 
Text textid = document.createTextNode(""+i); 
Text textmeno = document.createTextNode("Autor"+i); 
Text textemail = document.createTextNode("[email protected]"); 
Text texttel = document.createTextNode("65456465465"); 
Text textplat = document.createTextNode("200"); 
    noviny.appendChild(autor); 
    autor.appendChild(id); 
     id.appendChild(textid); 
    autor.appendChild(meno); 
     meno.appendChild(textmeno); 
    autor.appendChild(email); 
     email.appendChild(textemail); 
    autor.appendChild(tel); 
     tel.appendChild(texttel); 
    autor.appendChild(plat); 
     plat.appendChild(textplat); 
    } 
    TransformerFactory factory = TransformerFactory.newInstance(); 
    Transformer transformer = factory.newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
    transformer.transform(new DOMSource(document),new StreamResult(new File(subor))); 

я знаю, что StAX это способ быстрее в чтении документ, но я не могу это объяснить. Кроме того, что у меня есть довольно плохой код для StAX

благодаря

+0

Я предлагаю измените заголовок вопроса на smth как «Почему DOM быстрее при создании XML, чем StAX?» Было бы неплохо иметь некоторые измерения скорости. –

+0

@Evgeniy: я опубликую результаты позже, если это не проблема. благодаря – ivanz

ответ

8

Добавить BufferedOuputStream здесь

XMLStreamWriter w = f.createXMLStreamWriter(new BufferedOutputStream(new FileOutputStream(subor)), "UTF-8"); 

Теперь проверить скорость, и вы увидите, что StAX, по крайней мере в 2 раза быстрее