#java
Есть ли разница, в объявлении переменной за пределами цикла: int val = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { val++; } } И в цикле: for (int i = 0; i < 10; i++) { int val = 0; for (int j = 0; j < 10; j++) { val++; } } Значение переменной val на выходе будет разным - это понятно. Но вопрос в том, влияет ли это на производительность. Обрабатывает ли это компилятор. Я прогонял тесты с большим количеством итераций, по времени разницы не было. Но по логике вроде как должна была быть. Компилятор оптимизировал код?
Ответы
Ответ 1
Компилятор имеет полное право, код for (int i = 0; i < 10; i++) { int val = 0; for (int j = 0; j < 10; j++) { val++; } } превратить в int val; for (int i = 0; i < 10; i++) { val = 0; for (int j = 0; j < 10; j++) { val++; } } и насколько я знаю он так и делает, в результате получается одно лишнее присвоение, что мало сказывается на производительности. P.S. Вообще можно декомпилировать сгенеренный код и посмотреть, благо в какой-нибудь Идеа это делается легко и просто.Ответ 2
Да, разница есть и заключается она в следующем: Область видимости: в первом случае, переменная val видна как внутри циклов, так и извне, во втором – видна только внутри цикла (циклов) и не видна извне. Логика работы кода: в первом случае, на каждой итерации цикла переменная val инкрементируется и итоговое значение будет 100, во втором случае, на каждой итерации внешнего цикла, переменная val сбрасывается в ноль.Ответ 3
В вашем примере есть, причем существенная. В первом случае (объявлении вне цикла), значение переменной по итогу будет равно 100. Во втором случае - 10. Вобще разница в месте объявления переменной в том, что в некоторых случая она может выпадать из области видимости или вовсе не входить в нее.
Комментариев нет:
Отправить комментарий