Изменение стиля кодирования из-за производительности Android GC, как далеко это слишком далеко? - PullRequest
10 голосов
/ 07 апреля 2010

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

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

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

Ответы [ 2 ]

10 голосов
/ 07 апреля 2010

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

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

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

4 голосов
/ 07 апреля 2010

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

...