Производительность BeanUtils против ReflectionToStringBuilder (для использования в классах Bean) - PullRequest
7 голосов
/ 14 апреля 2011

В моем веб-приложении есть большое количество классов Java-бинов, и я пытаюсь найти простой способ реализации методов toString() в этих бинах.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [2]. * * * * * 1004(Apache commons-beanutils)
2. ReflectionToStringBuilder.toString() (Apache commons-lang)

Поскольку ожидается, что это веб-приложение имеет большой трафик, реализация должна быть легкой и не должна влиять на производительность.(Использование памяти, использование процессора и т. Д. Являются основными соображениями.)

Я хотел бы знать, какой из них работает лучше в соответствии с критериями, упомянутыми выше.Насколько я знаю, рефлексия - сложная операция, но более подробная информация и понимание обоих этих вариантов помогут мне выбрать оптимальное решение.

Ответы [ 4 ]

9 голосов
/ 14 апреля 2011

Лично я предпочитаю генерировать метод toString () с использованием Eclipse / IntelliJ, а затем модифицировать его по мере необходимости (включают только важные поля).

Щелкните правой кнопкой мыши -> Source -> Generate toString (). Выберите поля. Готово.

  1. Это занимает меньше времени, чем даже написание кода Builder.
  2. Это будет выполняться быстрее.
  3. Он не использует пространство пермгена (рефлексия может поглотить пермген)

Я бы пошел по этому пути, если вы беспокоитесь о производительности.

9 голосов
/ 14 апреля 2011

Мы используем ToStringBuilder.reflectionToString() в наших объектах toString(). У нас не было таких проблем в производственной среде. Конечно, мы редко используем метод toString().

Мы также используем BeanUtils.describe(), но для другой цели. BeanUtils использует PropertyUtilsBean, который хранит внутренний кеш бинов, для которых он выполнил самоанализ. Казалось бы, это дало бы ему преимущество в производительности по сравнению с другими, но немного повредило в источнике ReflexToString, и кажется, что, поскольку в конечном итоге он опирается на реализацию java.lang.Class, кеширование также вступает в игру.

Любой из них выглядит как жизнеспособный выбор, но BeanUtils.describe() вернет карту свойств, где mirrorToString вернет отформатированную строку. Я думаю, это зависит от того, что вы хотите сделать с выводом.

Я бы предположил, что если ваше приложение сильно зависит от вызова toString() для ваших объектов, то конкретная реализация может быть более выгодной.

2 голосов
/ 04 июля 2014

Будьте осторожны, так как это основано на отражении, оно будет медленным.

В недавнем веб-проекте наш метод toString () объекта Base был ToStringBuilder.reflectionToString (this)

Этот метод вызывается в спящем режиме во время сохранения (через репозиторий Spring Data JPA). У нас довольно большое дерево объектов с вложенными списками, что приводит к большому количеству памяти и загрузке ЦП во время сохранения.

Это почти затопило проект.

0 голосов
/ 27 октября 2011

Просто используйте генератор кода в вашей IDE для генерации метода toString (). Таким образом вы избежите накладных расходов, связанных с использованием отражений. В реальной производственной системе ваш метод toString () может вызываться очень часто (100 / сек), заставляя сборщик мусора усердно работать и приостанавливать работу вашей JVM. Эти паузы могут быть секундами или десятками секунд.

...