Заставь JAXB идти быстрее - PullRequest
12 голосов
/ 24 декабря 2011

У меня есть файл 8 Мег.Маршаллинг с использованием JAXB занимает 1082 мс, при использовании DOM - 862 мс, при использовании SAX - 438 мс.Это использует все значения по умолчанию с JDK 1.6, никакие дополнительные настройки, такие как использование woodstox, не используются.

Чтобы повысить производительность от JAXB, я стараюсь использовать SAX-разбор, выполняя ...

FileReader fr = new FileReader("myfile.xml");
JAXBContext jc = JAXBContext.newInstance(MyObjectList.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();

XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLEventReader xmler = xmlif.createXMLEventReader(fr);

long beginTime = System.currentTimeMillis();
MyObjectList obj = (MyObjectList)unmarshaller.unmarshal(xmler);
long endTime = System.currentTimeMillis();

Это делает его еще медленнее - 3207 мс.

Мои вопросы: 1. Как заставить JAXB работать быстрее?2. Как я могу быть на 100% уверен, какой механизм разбора он использует?

Ответы [ 2 ]

17 голосов
/ 24 декабря 2011

1 - Как заставить JAXB работать быстрее?

Вы на правильном пути с демаршаллингом от входа StAX, но я бы порекомендовал XMLStreamReader вместо XMLEventReader.

XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmler = xmlif.createXMLStreamReader(fr);

Поскольку StAX является стандартом, вы можете переключиться на другую реализацию, например WoodStox , в качестве базового синтаксического анализатора.

2 - Как я могу быть на 100%уверены, какой механизм разбора он использует?

Точно так же, как вы делаете.Если вы передадите реализации JAXB экземпляр XMLStreamReader, то вы можете быть достаточно уверены, что он используется.Если, с другой стороны, вы демонтировали что-то вроде InputStream, то реализация JAXB может свободно использовать любую технику синтаксического анализа, какую захочет.Если вы пользуетесь Woodstox, обязательно посетите страницу производительности:

2 голосов
/ 24 декабря 2011

Я не пробовал это, но EclipseLink предоставляет реализацию JAXB. http://www.eclipse.org/eclipselink/moxy.php Jibx должен быть быстрым, но я не думаю, что это реализация JAXB. Хотя это делает то же самое. http://jibx.sourceforge.net/index.html

Если EclipseLink соответствует требованиям, вы можете просто вставить его и попробовать. Не уверен насчет усилий по тестированию Jibx.

...