Почему "Избегайте перечислений, где вам нужны только инты", удалены из подсказок производительности Android?

Раздел "Избегайте перечислений, где вам нужны только инты" был удален из официальной документации разработчика. (См. Почему Android не использует больше перечислений? для содержимого старого раздела)

Почему? Были ли изменения в виртуальной машине Android, которые сделали чат устаревшим?

Ответ 1

Ответ 2011 года от Elliot Hugues сказал, что первоначальная причина избежать перечисления была связана с соображениями производительности... как в "производительности обработки". Поскольку эта причина не была подтверждена фактом, она была удалена из официальной документации.

Он был добавлен позже, потому что перечисления добавляют намного больше данных в память, чем использование целого.

Ответ 2

оригинальная версия этого документа была всего лишь кучей предрассудков. он был переписан, чтобы содержать только факты, подтвержденные фактическими критериями, и он обновляется по мере обновления виртуальной машины. вы можете найти различные тесты - плюс некоторые из тестов, которые мы используем для оптимизации основных библиотек, - на http://code.google.com/p/dalvik/.

Ответ 3

Догадка:

  • Процессоры Gigahertz, такие как Hummingbird и Snapdragon, теперь являются общими, а требования к малой памяти небольшого кода, которые первоначально ограничивали VM Dalvik, уже не соответствуют действительности.
  • Каждое устройство доставки использует JIT (новинка 2.2). Инициализатор классов перечислений будет работать быстрее, значения могут рассматриваться как постоянные JIT-времени, и JIT может иметь специальную поддержку для оптимизации классов enum.
  • Код, который действительно чувствителен к производительности, использует NDK, который был еще новым и неполированным, когда был выпущен Android 1.5. NDK в версии 2.3 поддерживает родные действия, что позволяет почти полностью неуправляемые игры.

Таким образом, для сравнительно мирских требований приложения GUI преимущества времени перечисления на время разработки намного превышают дополнительные затраты времени исполнения.

Ответ 4

Elliott Hughes предлагает более подробную информацию о перезаписи документации в своем блоге: http://elliotth.blogspot.com/2010/09/java-benchmarks.html

Вторая половина сообщения объясняет, что каждое утверждение в документе Performance dc теперь подкреплено контрольными показателями. Предыдущие версии документа, по-видимому, содержали непроверенные претензии, например: "Избегайте перечислений, потому что они слишком дороги".

Ответ 6

TL;DR: Dalvik плохо справился с распределением памяти, и Enum использует больше памяти, чем int. Android Lollipop заменил Dalvik на ART, который не страдает от тех же ограничений. Таким образом, эта рекомендация больше не актуальна.

Длинный ответ:

Вот Это Да! 8 лет, 5 ответов и много комментариев спустя настоящая причина до сих пор не устранена.

В дни Android, предшествующие леденцу на палочке, Dalvik был процессом, который использовала VM. Поскольку приложениям для этого времени было доступно небольшое количество памяти, у Дальвика было много ограничений по памяти. Для выделения памяти Далвику пришлось пройти кучу и найти место. Куча также со временем будет фрагментирована. Dalvik не может дефрагментировать, поэтому он будет распределяться с течением времени и в конечном итоге не хватит места.

Избегайте Enums, где вам нужны только Ints

происходит от дней Dalvik, потому что Enum намного больше, чем int и выделение памяти было очень дорогим.

Вскоре, Dalvik был заменен на ART. ART вышел в KitKat и по умолчанию с Lollipop.

ART был создан с нуля не для оптимизации памяти, а для оптимизации производительности. Он также оптимизирован для распределений и сборов. Причина в том, что у него выделена память для больших объектов. Вместо того, чтобы помещать все в одну кучу, а затем находить место для больших объектов среди всех крошечных, ART помещает все большие объекты и растровые изображения в отдельную кучу. И тогда мелкие предметы уходят в отдельную кучу. Также это может дефрагментировать.

После АРТ, если вы используете Enum Android, это не волнует, и именно поэтому рекомендация исчезла.

Это от Чета Хаазе из Google. Я рекомендую найти его разговор Google I/O и смотреть все видео. Он содержит много полезной информации и понимания Android.