Как разработать чрезвычайно эффективную функцию - PullRequest
6 голосов
/ 12 октября 2010

Я разрабатываю функцию (метод Java), которая будет выполняться 40-80 раз в секунду на мобильном устройстве.

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

В CI можно использовать, например, volatile, чтобы предотвратить выделение памяти моих переменных при каждом выполнении функции ... Я хочу сделать что-то подобное в Java, но не знаю как.

Функция сохраняет данные в

  • 1 строка
  • 4 целых числа
  • 2 одномерных строковых массивов

В целом, в Java, какой метод предпочтительнее использовать вышеупомянутые переменные, но не перераспределять их каждый раз, когда выполняется моя функция (40+ раз в секунду)?

Переменные-члены будут «работать», ноэто лучшее решение?

Спасибо!Брэд

Ответы [ 5 ]

3 голосов
/ 12 октября 2010
  • Оберните эти поля в классе {Java любит видеть Объект} и выделите его один раз и используйте его.
  • помните о концепции пула строк, так как у вас есть массив строк
1 голос
/ 12 октября 2010

Статические члены vars, они не будут выгружены, пока класс не выгружен.Имейте в виду, что если все ссылки на класс потеряны, возможно, что он может быть GC'ed.Я сомневаюсь, что это будет проблемой в вашем случае, однако это стоит отметить.Кроме того, если вы создаете новые экземпляры класса, содержащие статические члены vars, вы окажетесь в одной лодке с позицией распределения.

0 голосов
/ 12 октября 2010

Используйте либо статические поля класса, либо, если вы собираетесь создать только один экземпляр вашего класса, нормальные переменные-члены будут работать.

Если вам нужно изменить содержимое строки, рассмотрите возможность использования StringBuilder вместо неизменяемых экземпляров String, которые будут созданы / gc'ed.

int - это примитивы, поэтому они не являются проблемой.

Ваши строковые массивы будут в порядке, но подумайте о том, что вы вкладываете в них. Вы создаете новые объекты String и позволяете старым gc?

0 голосов
/ 12 октября 2010

Вы можете использовать статические переменные для этого, но это предполагает, что эти переменные являются константами или что их изменения не оказывают плохого влияния на другие потоки, в настоящее время вызывающие ту же функцию.

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

0 голосов
/ 12 октября 2010

Я полностью согласен с этим ответом.

Каждый вызов вашей функции будет выделять больше памяти, если вы создаете переменные на лету, поскольку GC Java не очищает полностью, пока не будет вызвано уничтожение, когда класс удаляется.

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

...