Какова производительность Jackson по сравнению с JAXB при создании XML?

#java #jackson #jaxb #jackson-dataformat-xml

#java #джексон #jaxb #jackson-dataformat-xml

Вопрос:

Мне нужно преобразовать большое количество данных в формат XML. Я изучаю JAXB, поскольку он является частью JDK 8, но я не уверен в том, как он работает с огромными данными. Jackson XML — это еще одна библиотека, с которой я сталкиваюсь, которая новее. Быстрее ли Jackson, чем JAXB, при сериализации объекта в XML?

Ответ №1:

Однажды я написал сценарий использования для тестирования производительности jackson и jaxb при сериализации и десериализации объекта в / из xml. тестовый код:

сериализация:

 /** counter */
private int counter = 10000;

@Test
public void doTest() throws JAXBException{
    TextMsg msg = new TextMsg();
    msg.setToUserName("jackson");
    msg.setFromUserName("hawaii");
    msg.setContent("jack<xml val='Json'>]]>");
    long start = System.currentTimeMillis();
    for(int i=0; i< counter; i  ){
        ByteArrayOutputStream xmlOut = null;
        ByteArrayInputStream xmlIn = null;
        try{
            xmlOut = new ByteArrayOutputStream();
            XMLFactory.toXML(msg, xmlOut);
            String xml = new String(xmlOut.toByteArray());
        }finally{
            IOUtils.closeQuietly(xmlIn);
            IOUtils.closeQuietly(xmlOut);
        }
    }
    long end = System.currentTimeMillis();
    logger.info("consume:{}", end - start);
}
 

десериализация

 /** counter */
private int counter = 10000;
    
@Test
public void doTest() throws IOException, JAXBException{
    String xml = "<?xml version='1.0' encoding='UTF-8'?><xml><ToUserName><![CDATA[jackson]]></ToUserName><FromUserName><![CDATA[hawaii]]></FromUserName><Content><![CDATA[jackamp;<xml val=amp;apos;Jsonamp;apos;amp;>]]amp;>]]></Content></xml>";
    long start = System.currentTimeMillis();
    for(int i=0; i< counter; i  ){
        ByteArrayOutputStream xmlOut = null;
        ByteArrayInputStream xmlIn = null;
        try{
            xmlOut = new ByteArrayOutputStream();
            TextMsg textMsg = XMLFactory.fromXML(xml, TextMsg.class);
        }finally{
            IOUtils.closeQuietly(xmlIn);
            IOUtils.closeQuietly(xmlOut);
        }
    }
    long end = System.currentTimeMillis();
    logger.info("consume:{}", end - start);
}
 

результат (единица измерения: миллисекунда, среднее значение для 3-кратного теста):

 type: entity -> xml
JAXB:24716
Jackson:1123
JAXB:Jackson  22:1

type: xml -> entity
JAXB: 31622
Jackson: 1049
JAXB:Jackson  30:1
 

заключение:
Та же задача, при сериализации, Jackson использует 1/22 времени, затрачиваемого JAXB. При десериализации Jackson использует 1/30 времени, затрачиваемого JAXB.