2010-03-19 2 views
8

Я использовал JAXB Marshaller, а также свой собственный маршаллер для сортировки чистых объектов java bean в XML. Было замечено, что оба они требуют почти одинакового времени для маршала. Производительность неприемлема и нуждается в улучшении. Каковы возможные способы улучшения производительности маршаллера? Как нарезание резьбы?Производительность marshaller Java

+2

как это неприемлемо? Каков ваш ориентир? Поделитесь ею – Bozho

+0

Здесь есть очень старые (но все же интересные) этапы: https://bindmark.dev.java.net/old-index.html – skaffman

+0

Вы проверили, есть ли проблема с проверкой нескольких раз? Я сомневаюсь!! – srinannapa

ответ

3

Вторичное использование JibX. Как и квестз, я обнаружил, что JibX был в 9 раз быстрее, чем JAXB в моих тестах производительности.

Кроме того, убедитесь, что у вас есть древесный порошок на пути к классу при использовании JibX. Я обнаружил, что реализация Stax Woodstox составляет примерно 1050% быстрее, чем реализация Stalk Java6.

+0

+1 для woodstox – skaffman

+1

Ничего против JibX, но из того, что я видел, 9x кажется довольно высоким. JAXB был для меня достаточно совершенным, если вы используете Woodstox, не используйте проверку (что Jibx не будет делать, и редко полезно для сортировки). А также, если это возможно, НЕ используйте версии JAXB impl JDK bundles: используйте последнюю версию. – StaxMan

+0

На самом деле, подумайте об этом больше, я помню, что пакет Sun Stax (Sjsxp) был МНОГО медленнее при написании XML, чем Woodstox - это может объяснить разницу в 9 раз, если JibX использует Woodstox (который по умолчанию имеет значение) – StaxMan

1

По моему опыту, JIBX http://jibx.sourceforge.net/ был почти в 10 раз быстрее, чем JAXB. Да, я измерил его для спецификации производительности. Мы использовали его для привязки java beans с большим HL7 xml. При этом способ повышения производительности - не полагаться на определение схемы, а писать пользовательские привязки.

11

Убедитесь, что вы создаете экземпляр контекста JaxB только один раз, для создания контекста требуется некоторое время, поскольку оно использует отражение для анализа аннотаций объекта.

Обратите внимание, что JAXBContext является потокобезопасным, но маршаллерами \ unmarshallers нет, поэтому вам все равно нужно создать маршаллер для каждого потока. Однако я обнаружил, что создание маршаллеров, когда вы уже используете jaxb-контекст, довольно быстро.

+1

Спасибо за это комментарий, помог ускорить мой юнит совсем немного. Построение jaxb-контекста для меня занимает 14+ секунд. После этого, хотя маршал/немаршалы довольно быстр: 0.116s marshal: 0.023s – Russ

+0

Это должен быть принятый ответ. –

5

Byeond другие хорошие предложения, я предлагаю что-то не так с тем, как вы используете JAXB - это, как правило, достаточно хорошо выполнять до тех пор, как:

  • Вы можете использовать JAXB версии 2 (никогда никогда не использовать устаревшие JAXB 1 - это был ужасно медленный, бесполезный кусок дерьма); предпочтительно в версии 2.1.x от http://jaxb.dev.java.net
  • Убедитесь, что вы используете источник SAX или источник или источник Stax; НИКОГДА не используйте DOM, если вы абсолютно не должны взаимодействовать с ним: использование DOM сделает его на 3 - 5 раз медленнее, без каких-либо преимуществ (он просто удваивает объектную модель: POJO -> DOM -> XML; деталь DOM совершенно не нужна)
  • Идеально использовать самую быструю Доступен анализатор SAX/Stax; Woodstox быстрее, чем комплектный процессор Stax Солнца (и исй. Осущий БЭ. Не глючит, не быстрее, чем Солнца)

Если JAXB все еще более чем на 50% медленнее, чем вручную письменный вариант, я бы профиль его, чтобы увидеть, что иначе происходит не так. Он не должен работать медленно при правильном использовании - я постоянно измерял его и нашел его настолько быстрым, что конвертеры для ручной записи обычно не стоят времени и усилий.

Jibx - хороший пакет, кстати, поэтому я ничего не имею против этого. Это может быть бит быстрее, чем JAXB; просто не 5x или 10x, если оба используются правильно.

0

Мы можем достичь производительности в Marshalling и unmarshalling, установив свойство быстрой загрузки на системном уровне. Это значительно улучшит производительность.

System.setProperty ("com.sun.xml.bind.v2.runtime.JAXBContextImpl.fastBoot", "true");

1

Мы только что отслеживали проблему производительности JAXB, связанную с конфигурацией парсера по умолчанию, используемой Xerces. Производительность JAXB была очень медленной (30 с +) для одного файла данных (< 1Mb)

Цитата «Как изменить конфигурацию парсера по умолчанию?"От http://xerces.apache.org/xerces2-j/faq-xni.html

В DOM и SAX-парсеры решить, какой анализатор конфигурации для использования в следующем порядке

  1. Свойство системы org.apache.xerces.xni.parser.XMLParserConfiguration запрашивается для имени класса из конфигурации парсера.
  2. Если в подкаталоге lib установки JRE существует файл с именем xerces.properties, и свойство org.apache.xerces.xni.parser.XMLParserConfiguration определено, то его значение будет считано из файл.
  3. Файл org.apache.xerces.xni.parser.XMLParserConfiguration запрашивается из каталога META-INF/services /. Этот файл содержит имя класса конфигурации парсера.
  4. org.apache.xerces.parsers.XIncludeAwareParserConfiguration используется в качестве конфигурации парсера по умолчанию.

Демаршаллизация с использованием результатов JAXB в этом алгоритме быть применен многократно. Таким образом, огромное количество времени может быть потрачено многократно на сканирование пути к классам, ища файл конфигурации, который не существует. Исправление состоит в том, чтобы выполнить опцию 1, вариант 2 или вариант 3 (создать файл конфигурации в META-INF). Все, что необходимо для предотвращения повторного сканирования классов.

Надеюсь, это поможет кому-то - нам потребовались дни, чтобы отслеживать это.