Можно глупый вопрос, почему java данный цикл не с оптимизировала ? Переменная локальная — цикл ничего полезного не делает, функция статическая. Зачем java нужно исполнать этот код ? Выкинула бы его к чёртовой бабушки и показала бы нормальное время исполнения — 0.001 . Или я чего-то недопонимаю ?
Здравствуйте, vt_vitus, Вы писали:
А>> for(long myCnt = 0;myCnt < 100000000; myCnt++) { А>> String myString ="Hello World"+myCnt; А>> }
_>Можно глупый вопрос, почему java данный цикл не с оптимизировала ? Переменная локальная — цикл ничего полезного не делает, функция статическая. Зачем java нужно исполнать этот код ? Выкинула бы его к чёртовой бабушки и показала бы нормальное время исполнения — 0.001 . Или я чего-то недопонимаю ?
Ну может кто-то так паузу делает. Ну или производительность тестирует
Насколько я знаю, javac таким не грешит, то есть не слышал о случаях, когда компилятор решил, что кусок кода не нужен, и выкинул его из результирующего байт-кода. Мало ли какая гениальная мысль, непонятая компилятором, там содержалась. Для этих целей надо использовать всякие оптимизаторы/обфускаторы, ну а лучше всего, конечно, голову.
Здравствуйте, Donz, Вы писали:
D>Ну может кто-то так паузу делает. Ну или производительность тестирует D>Насколько я знаю, javac таким не грешит, то есть не слышал о случаях, когда компилятор решил, что кусок кода не нужен, и выкинул его из результирующего байт-кода. Мало ли какая гениальная мысль, непонятая компилятором, там содержалась. Для этих целей надо использовать всякие оптимизаторы/обфускаторы, ну а лучше всего, конечно, голову.
public static final boolean flag = false;
.....
if (flag) {
//это код будет выкинут
}
Здравствуйте, Lucker, Вы писали:
D>>Ну может кто-то так паузу делает. Ну или производительность тестирует D>>Насколько я знаю, javac таким не грешит, то есть не слышал о случаях, когда компилятор решил, что кусок кода не нужен, и выкинул его из результирующего байт-кода. Мало ли какая гениальная мысль, непонятая компилятором, там содержалась. Для этих целей надо использовать всякие оптимизаторы/обфускаторы, ну а лучше всего, конечно, голову.
L>
L> public static final boolean flag = false;
L> .....
L> if (flag) {
L> //это код будет выкинут
L> }
L>
В данном случае кусок кода в принципе недосягаем, не то, короче. Речь идёт о коде, который может быть достигнут, но выполняется "бесполезно".
D>Насколько я знаю, javac таким не грешит, то есть не слышал о случаях, когда компилятор решил, что кусок кода не нужен, и выкинул его из результирующего байт-кода. Мало ли какая гениальная мысль, непонятая компилятором, там содержалась. Для этих целей надо использовать всякие оптимизаторы/обфускаторы, ну а лучше всего, конечно, голову.
Компилятор, может и нет, а вот jvm с этим справляется, например запущенная с опцией -server благополучно оптимизирует этот код:
private void test() {
int a = 0;
for (int i=0; i<100000000; i++){
a = a +1;
}
}
Здравствуйте, Sserega, Вы писали:
S>Компилятор, может и нет, а вот jvm с этим справляется, например запущенная с опцией -server благополучно оптимизирует этот код: S>
S>private void test() {
S> int a = 0;
S> for (int i=0; i<100000000; i++){
S> a = a +1;
S> }
S>}
S>
А каким именно образом? Просто делает значение a сразу таким, каким оно должно быть после выполнения цикла? И как это выяснилось?
Здравствуйте, Donz, Вы писали:
D>А каким именно образом? Просто делает значение a сразу таким, каким оно должно быть после выполнения цикла? И как это выяснилось?
Да. Выясняется путем увеличения количества итераций в 10, 100 раз. Время выполнения при этом не меняется
Вот код
public class Test
{
public static void main(String[] args) {
int c = Integer.parseInt(args[0]);
long t1 = System.nanoTime();
int a = 0;
for (int i=0; i<c; i++){
a = a +1;
}
long t2 = System.nanoTime();
System.out.println((t2-t1) + " " + a);
}
}
Запускаю:
java -server Test 100000
7134147 100000
java -server Test 1000000
7190020 1000000
java -server Test 10000000
7038325 10000000
Убираю -server:
java Test 100000
4566782 100000
java Test 1000000
13588877 1000000
java Test 10000000
111377005 10000000
Как видим в первых трех случаях время выполнения неизменно, во вторых трех — растет. Java 1.5.0_04