Как область локальных переменных влияет на производительность загрузки / хранения на Java? - PullRequest
0 голосов
/ 27 августа 2018

environment : JDK1.8 Windows 10

example1:

String msg=null;
for (int i=0;i<10;i++){
     msg="Hello";
 }

и example2:

for(int =0;i<10;i++){
      String msg = "hello";
}

Кто может подсказать разницу между этими двумя примерами икакой код более эффективен

1 Ответ

0 голосов
/ 27 августа 2018

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

I 'Теперь я продолжу для любопытного читателя.Скомпилировав код с javac 1.8.0_171 и разобрав с помощью javap -c, я получаю следующий байт-код:

Первый подход:

    Code:
       0: aconst_null
       1: astore_1
       2: iconst_0
       3: istore_2
       4: iload_2
       5: bipush        10
       7: if_icmpge     19
      10: ldc           #2                  // String f
      12: astore_1
      13: iinc          2, 1
      16: goto          4
      19: return

Второй подход:

    Code:
       0: iconst_0
       1: istore_1
       2: iload_1
       3: bipush        10
       5: if_icmpge     17
       8: ldc           #2                  // String f
      10: astore_2
      11: iinc          1, 1
      14: goto          2
      17: return

Как видите, два скомпилированных результата материально очень похожи.Оба имеют структуру цикла, а тело цикла состоит из постоянной нагрузки (ldc), за которой следует astore_<n> в слот локальной переменной.Присвоение переменных временным интервалам варьируется (первый присваивает i временному интервалу 2 и msg равному 1, второй делает обратное), но это не должно иметь значительного эффекта.Первый включает два дополнительных байт-кода для хранения от null до msg до первой итерации.Однако влияние этого настолько микроскопично, что нет смысла пытаться оптимизировать это.

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

...