1 Вопрос: Оптимизировать получение значений параметров

вопрос создан в Wed, May 8, 2019 12:00 AM

Я хотел бы знать, есть ли разница в производительности между этими двумя способами получения значения параметра в Java:

Вариант 1 .

for(int i=0; i<1000; i++) {
    System.out.println(object.getName());
}

Вариант 2 .

String name = object.getName();
for(int i=0; i<1000; i++) {
   System.out.println(name);
}

Может быть, только с одним атрибутом (именем) вариант 2 лучше, но что, если у меня будет 50 разных атрибутов? Я бы потратил впустую память на хранение этих переменных.

Пожалуйста, подумайте масштабно, в огромной системе с множеством пользователей, обращающихся к WebApp.

    
0
  1. Трата памяти будет очень мала, так же как и прирост производительности. Это называется микрооптимизацией, и вы не должны принимать это во внимание при разработке (или только в очень конкретных случаях). Компиляторы могут сделать много вещей, чтобы оптимизировать его лучше, чем вы, и вы жертвуете удобочитаемостью для производительности, даже не будучи уверенным в достижении лучшей производительности. PS: да, я думаю о больших системах с тысячами одновременных пользователей. Даже там вы не должны этого делать.
    2019-05-08 16: 05: 06Z
  2. Итак, какой вариант вы бы использовали? Или какой из них вы обычно используете?
    2019-05-08 16: 06: 44Z
  3. Самый читаемый. Не храните временные переменные, чтобы сэкономить вызов получателю. Сохраняйте временную переменную, если вы получаете их от дорогого вызова бизнес-метода.
    2019-05-08 16: 08: 04Z
  4. @ Энди Я должен перефразировать его как «напишите наиболее читабельное, что вы можете. Если вы пытаетесь что-то оптимизировать, то принимайте меры до и после оптимизации»
    2019-05-08 16: 14: 38Z
  5. Что важнее производительности, так это семантическая разница между ними в многопоточных средах, где имя может измениться во время выполнения цикла.
    2019-05-08 16: 21: 19Z
1 ответ                              1                         

Первый вариант должен запускаться object.getName() 1000 раз, другой цикл - только один раз.

Итак, да, очевидно, должно быть определенное влияние на производительность. Существует также небольшое семантическое различие: если это имя не является неизменным, другие потоки могут изменить его во время работы цикла. Тогда вариант 2 может зафиксировать это изменение в некоторый случайный момент времени, тогда как вариант 1 этого не сделает.

Что касается аспектов производительности: в Java действительно трудно определить последствия таких тонких изменений кода. Когда этот цикл выполняется 100K раз, включается компилятор Just-in-time и переводит все в высокооптимизированный машинный код, используя такие методы, как вставка метода, развертывание цикла, постоянное свертывание и так далее. Он может даже обнаружить, что object.getName() не имеет побочных эффектов, и, таким образом, превратить ваш код во что-то, что вы положили в свой фрагмент 2 варианта. Все это происходит во время выполнения, в зависимости от информации профилирования, которую JVM собрала для JIT во время выполнения вашего кода.

Итак, типичный ответ, касающийся "производительности Java": избегайте глупых ошибок (вызывать метод, который не имеет побочных эффектов внутри цикла, было бы такой ошибкой), но не ожидайте что кто-то может сказать вам: «Да, вариант 1 будет работать на 500 мс быстрее». «Реальное» повышение производительности в java создается JIT (и, конечно, умными проектами для вашей реализации). Таким образом, чрезвычайно трудно предсказать , что будет иметь тот или иной артефакт исходного кода во время времени выполнения .

И наконец: обратите внимание, что использование System.out.println() довольно дорого. Таким образом, когда ваш getName() действительно просто извлекает свойство из памяти, тогда печать этого значения в консоль может быть в несколько раз дороже по сравнению со извлечением значений!

    
2
2019-05-09 05: 54: 53Z
  1. Спасибо за ваш подробный ответ. System.out.println () был упрощенным способом объяснить это. Я хотел сказать, что я часто вызывал этот метод (getName).
    2019-05-08 16: 40: 00Z
  2. @ Ommadawn Добро пожаловать!
    2019-05-08 16: 44: 34Z
источник размещен Вот