Эффективное использование памяти? Случай переключения со строками

1

Мне было интересно, какой будет лучший способ сохранить некоторые ресурсы и память в моем тестовом приложении. Я знаю, что создание объектов поглощает память и замедляет приложение, а в приложении для этого кода нужен случай переключения значений String. Так что было бы лучше? Оператор if else для всех строковых значений, чтобы назначить каждому из них целочисленный тег и использовать случай переключения или создать Enumerator и использовать переключатель напрямую?

Количество записей = 40-50.

  • 1
    Как часто вы делаете этот поиск на одном и том же наборе строк? Если больше, чем, может быть, 4 раза, то путь - это хеш-таблица. (Не зацикливайтесь на создании объектов - обращаясь с потоками пользовательского интерфейса через огромное количество объектов, поэтому еще несколько здесь и здесь нет ничего важного.)
Теги:

2 ответа

3
Лучший ответ

Я знаю, что создание объектов поглощает память и замедляет работу приложения...

Это обобщение проблематично:

Да, создание объекта требует памяти и требует времени, но это не обязательно замедляет работу приложения. Это зависит от того, что альтернатива созданию объекта. Вполне возможно, что альтернатива замедляет приложение больше.

И даже если предположить, что версия "создать объект" использует больше ресурсов, чем альтернативу, есть хороший шанс, что разница не будет значительной.

То, что вы, кажется, делаете здесь, - преждевременная оптимизация. Мой совет:

  • пусть JVM справится с оптимизацией (возможно, это может быть лучше, чем вы,),
  • оставьте любую ручную оптимизацию на более позднюю дату и сделайте это только в том случае, если измеренная производительность приложения фактически гарантирует ее, и
  • используйте процессор или профайлер памяти, чтобы направлять вас к частям вашего кода, где, как правило, требуется оптимизация рук, чтобы получить хорошую отдачу.

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

Третий вариант, который вы не упомянул, заключается в использовании enum вместо String или int. Это будет более аккуратным, чем реализация преобразования String to int с использованием предварительно заполненного HashMap или чего-то еще.

  • 0
    Хорошо. Будет иметь это в виду. Благодарю.
  • 0
    Можете ли вы взглянуть на этот вопрос ?
Показать ещё 1 комментарий
3

Не беспокойтесь об этом. Новый оператор переключения Java 7 автоматически делает это за вас.

При компиляции коммутатор со строковыми случаями преобразуется в два переключателя. Первая отображает каждую строку в уникальное целое число - его положение в исходном коммутаторе. Это делается путем первого включения хэш-кода метки. Соответствующим случаем является оператор if, который проверяет равенство строк; если в хеше есть столкновение, тест является каскадным if-else-if. Второй переключатель отражает это в исходном исходном коде, но заменяет метки меток соответствующими позициями. Этот двухэтапный процесс упрощает сохранение управления потоком исходного коммутатора.

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

  • 5
    Android не использует Java 7.
  • 0
    @GrahamBorland: Хорошо, операторы String Switch в любом случае работают только в Java 7, так что ...
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню