В первом примере 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-компилятор оптимизирует весь цикл.