Сделать JAXB быстрее

У меня есть файл размером 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% уверен в том, какой базовый механизм синтаксического анализа он использует?

Ответ 1

1 - Как сделать JAXB быстрее?

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

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

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

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

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

Ответ 2

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

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