Повышение производительности JaxB

Проект, который я принимаю, использует JaxB API для демаршалирования объектов XML в Java. Мы передаем ByteArrayInputStream в Unmarshaller, например:

ByteArrayInputStream bais = new BytearrayInputStream(byte[]...)
unmarshaller.unmarshal(bais)

Теперь я хотел бы найти способы оптимизировать скорость этого процесса, учитывая, что массив байтов действительно мал (по умолчанию JaxB занимает около 1-5 мс), но их множество. Я пытался передать Unmarshaller различные входные данные, такие как парсеры StAX, StAX-Woodstox и объект StreamSource для сравнения.

unmarshall(..XMLInputFactory -> XMLStreamReader(bais)..)
unmarshall(..XMLInputFactory2 ->XMLStreamReader(bais)..)
unmarshall(..StreamSource(bais)..)

Из примерно 5000 попыток анализатор StAX-Woodstox показал себя лучше, чем другие.

Вот 2 вопроса, которые я хочу задать:

  • Учитывая эти фрагменты информации, не могли бы вы придумать лучший способ оптимизировать это с точки зрения скорости?
  • Что может быть причиной того, что прохождение парсера StAX-Woodstox дало лучшую скорость?

person sharius2301    schedule 14.06.2017    source источник


Ответы (1)


Вполне вероятно, что в других случаях выполняется ненужная инициализация (например, создание фабрик или использование очень медленного самоанализа службы). Я не думаю, что есть более эффективные альтернативы, чем создание потокового считывателя самостоятельно, хотя Woodstox, по крайней мере, позволяет вам передавать byte[] напрямую без ByteArrayInputStream. Скорее всего, это не будет иметь большого значения, но от упаковки нет никакой пользы.

Aalto XML, вероятно, еще быстрее: https://github.com/FasterXML/aalto-xml -- чего это стоит.

person StaxMan    schedule 15.06.2017