У меня есть проект, в котором я создаю несколько разных парсеров XML. В каждом случае я начинаю с XSD, использую JAXB для генерации аннотированных классов и имею несколько простых шаблонов для анализа потока XML, например:
JAXBContext context = JAXBContext.newInstance(contextClasses);
Unmarshaller parser = context.createUnmarshaller();
Object object = parser.unmarshal(stream);
contextClasses
имеет тип Class[]
и содержит класс, соответствующий корневому тегу XML, а в некоторых случаях и класс ObjectFactory
.
На сегодняшний день это сработало очень хорошо. Сейчас я добавляю новый синтаксический анализатор Oracle Agile XML на основе их XSD . Это не особенно сложный XSD. Тем не менее, в результате сгенерированные JABX классы насчитывают более 350 и входят в 620K LOC. Так что много сгенерированного кода. Конечно, больше, чем любой из моих других парсеров. Следующий самый сложный XSD дает более 130 классов.
Для этого парсера я передаю только корневой тег AgileData
в строку:
JAXBContext context = JAXBContext.newInstance(contextClasses);
и для завершения этой строки во время выполнения требуется более минуты. Процессор скачет до 30-40% на время. Это сравнивает неблагоприятно со всеми другими моими парсерами, где эта строка завершается в общеизвестной доли секунды.
Итак, почему эта строка занимает так много времени для завершения? (Когда я просматриваю код, кажется, что он просто читает и загружает классы и свойства, поэтому я предполагаю, что это функция количества сгенерированного кода.)
Что более важно, есть ли что-нибудь, что я могу сделать, чтобы он работал намного быстрее, т.е. в то же время, что и другие мои парсеры?