Почему из советов по производительности Android было удалено «Избегайте перечислений, где нужны только целые числа»? - PullRequest
169 голосов
/ 28 февраля 2011

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

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

Ответы [ 6 ]

157 голосов
/ 10 марта 2011

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

26 голосов
/ 28 февраля 2011

Предположение:

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

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

23 голосов
/ 28 апреля 2011

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

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

12 голосов
/ 13 марта 2015

В ответе Эллиота Хьюга за 2011 год говорилось, что первоначальная причина избегать перечисления была из соображений производительности ... как в «производительности обработки». Поскольку эта причина не была подтверждена фактом, она была удалена из официальной документации.

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

7 голосов
/ 09 июня 2015

Это все еще плохо для производительности памяти.

https://developer.android.com/training/articles/memory.html#Overhead

0 голосов
/ 24 мая 2019

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

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...