Изменение стиля кодирования из-за производительности Android GC, насколько далеко?

Я продолжаю слышать, что приложения для Android должны пытаться ограничить количество созданных объектов, чтобы уменьшить нагрузку на сборщик мусора. Имеет смысл, что вы можете не захотеть создать массивное количество объектов для отслеживания на ограниченном пространстве памяти, например, в традиционном серверном приложении, создавшем 100 000 объектов в течение нескольких секунд, не было бы неслыханно.

Проблема в том, как далеко я должен это принять? Я видел множество примеров приложений для Android, полагающихся на статическое состояние, чтобы якобы "ускорить процесс". Увеличивает ли количество экземпляров, которые должны быть мусором, собранными от десятков до сотен, действительно делает эту большую разницу? Я могу представить, как изменить стиль кодирования, чтобы теперь создать сотни тысяч объектов, например, на полномасштабном сервере Java-EE, но полагаясь на кучу статического состояния, чтобы (предположительно) уменьшить количество объектов, которые будут собирать мусор, кажется нечетные.

Сколько действительно необходимо изменить стиль кодирования, чтобы создать производительность приложений для Android?

Ответ 1

Совет "избегать распределения" обычно относится к игровым циклам. VM должна приостановить сбор мусора, и вы не хотите, чтобы это происходило, когда ваша игра оживлялась со скоростью 30 кадров в секунду. Если вы не выделяете какие-либо объекты, VM не нужно будет собирать мусор в свободную память. Если у вас есть игра, которая должна запускаться без видимых пользователем икоты, вам следует рассмотреть возможность изменения кода в соответствующих частях, чтобы минимизировать или исключить выделение.

Если вы создаете приложение, которое содержит рецепты или показывает фотографии, я бы не стал беспокоиться об этом - GC Hiccup - это не то, что пользователь, скорее всего, заметит.

Будущие улучшения в GC Dalvik (например, коллекцию поколений) должны сделать это менее проблематичным.

Ответ 2

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