Re[9]: хочу невозможного
От: Cyberax Марс  
Дата: 09.11.07 07:18
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>>>О каком ударе по производительности ты говоришь — не понял.

C>>У тебя будут основные тормоза на разборе XML. Да еще ты вроде бы начал JAXB использовать.
PD>Еще не начал. Не стоит пробовать ?
Стоит. Попробуй и посмотри какое замедление будет. Еще на XML Binding из http://javolution.org/ можно посмотреть.

C>>Если нужна скорость — используй быстрый парсер XML (лучше SAX или pull-парсер) и делай оптимизированый ручной mapping.

PD>Так сейчас и делается. Xerces SAX и ручная разборка. Про pull-парсеры не в курсе, если можешь, дай линк.
Xerces известен как достаточно большой тормоз, так что может иметь смысл взять альтернативный парсер.

Про pull-парсер — поищи по слову StAX.

PD>Сделал я следующий тест. В SAX заменил реальный content handler на пустой handler. Иными словами, SAX все делает как обычно, разбирает XML, парсит текст, вызывает у меня startDocument и прочее, только я в ответ никакие экземпляры не создаю и поля не заношу (а там, напоминаю, один числа и текстовые строки в конце концов). Так вот, время составляет примерно 50% от настоящего. Иными словами, 50% времени уходит на создание объектов (а может, на уничтожение потом ?) и присваивание значений полям.

Можно пример? Кстати, ты, надеюсь, HotSpot-компиляцию не считаешь?

PD>И еще одно я сделал. Нашел некий SAX piccolo (http://piccolo.sourceforge.net/), который, как там утверждается, быстрее Xerces. Попробовал его. В среднем быстрее, но на некоторых образцах раза в 3-4 медленнее, причем нестабильно : пропускаю тесты один раз — медленнее, еще раз — нормально.

Точно, HotSpot-компиляцию считаешь. Дело в том, что в Java байт-код транслируется в машинный код после того, как он будет работать в режиме интерпретации некоторое время. Порог компиляции зависит от опций JVM: серверная JVM имеет более высокий порог и использует большее количество оптимизаций (из-за чего программы под ней медленно запускаются, но потом работают быстрее), клиентская JVM имеет более низкий порог (т.е. она оптимизирована на более быстрый запуск).

На микротестах оно может дать очень существенный разброс. Например, мой сервер запускается за 3.5 секунды на клиентской JVM и более 6 секунд на серверной. Зато пропускная способность сервера на серверной JVM получается на 20% выше (из-за большего количества оптимизаций).
Sapienti sat!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.