Сделать 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.