В Мустанге сборка мусора в 2 раза быстрее?
От: Аноним  
Дата: 29.01.06 15:03
Оценка:
Нашел тест на сборку мусора, маленький, сразу его прогнал и удивился результату
public class ShortTest{
public static void main(String[] args){
        long t0,t1;
        t0=System.currentTimeMillis();

        for(long myCnt = 0;myCnt < 100000000; myCnt++) {
            String myString ="Hello World"+myCnt;
        }

        t1=System.currentTimeMillis();
        double deltaT=t1-t0;
        System.out.println("in sec: "+(deltaT/1000));
}
}

Результат
“c:\Program Files\Java\jre1.6.0\bin\java.exe" ShortTest
in sec: 21.969
“c:\Program Files\Java\jre1.6.0\bin\java.exe" ShortTest -server
in sec: 21.532
“c:\Program Files (x86)\Java\jdk1.5.0_04\bin\java.exe" ShortTest
in sec: 40.907
“c:\Program Files (x86)\Java\jdk1.5.0_04\bin\java.exe" ShortTest -server
in sec: 30.672

Что скажете?
Re: В Мустанге сборка мусора в 2 раза быстрее?
От: Trean Беларусь http://axamit.com/
Дата: 29.01.06 15:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нашел тест на сборку мусора, маленький, сразу его прогнал и удивился результату


[skipped]

А>Что скажете?


А что тут скажешь... гуд . Вроде усовершенствовали/добавили register allocation и escape analysis.

Вот тут писали

вроде в этой статье были ошибки в цифрах, но я видел поправленную версию где-то.
Re: В Мустанге сборка мусора в 2 раза быстрее?
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 29.01.06 15:45
Оценка: +4
Здравствуйте, <Аноним>, Вы писали:

А>“c:\Program Files\Java\jre1.6.0\bin\java.exe" ShortTest

А>“c:\Program Files\Java\jre1.6.0\bin\java.exe" ShortTest -server

А>Что скажете?


Не совсем понял откуда уверенность, что это тест именно сборщика мусора?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re: В Мустанге сборка мусора в 2 раза быстрее?
От: vt_vitus  
Дата: 18.02.06 02:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А> for(long myCnt = 0;myCnt < 100000000; myCnt++) {

А> String myString ="Hello World"+myCnt;
А> }

Можно глупый вопрос, почему java данный цикл не с оптимизировала ? Переменная локальная — цикл ничего полезного не делает, функция статическая. Зачем java нужно исполнать этот код ? Выкинула бы его к чёртовой бабушки и показала бы нормальное время исполнения — 0.001 . Или я чего-то недопонимаю ?
Re[2]: В Мустанге сборка мусора в 2 раза быстрее?
От: Donz Россия http://donz-ru.livejournal.com
Дата: 18.02.06 12:25
Оценка:
Здравствуйте, vt_vitus, Вы писали:

А>> for(long myCnt = 0;myCnt < 100000000; myCnt++) {

А>> String myString ="Hello World"+myCnt;
А>> }

_>Можно глупый вопрос, почему java данный цикл не с оптимизировала ? Переменная локальная — цикл ничего полезного не делает, функция статическая. Зачем java нужно исполнать этот код ? Выкинула бы его к чёртовой бабушки и показала бы нормальное время исполнения — 0.001 . Или я чего-то недопонимаю ?


Ну может кто-то так паузу делает. Ну или производительность тестирует
Насколько я знаю, javac таким не грешит, то есть не слышал о случаях, когда компилятор решил, что кусок кода не нужен, и выкинул его из результирующего байт-кода. Мало ли какая гениальная мысль, непонятая компилятором, там содержалась. Для этих целей надо использовать всякие оптимизаторы/обфускаторы, ну а лучше всего, конечно, голову.
Re[3]: В Мустанге сборка мусора в 2 раза быстрее?
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 18.02.06 12:36
Оценка:
Здравствуйте, Donz, Вы писали:

D>Ну может кто-то так паузу делает. Ну или производительность тестирует

D>Насколько я знаю, javac таким не грешит, то есть не слышал о случаях, когда компилятор решил, что кусок кода не нужен, и выкинул его из результирующего байт-кода. Мало ли какая гениальная мысль, непонятая компилятором, там содержалась. Для этих целей надо использовать всякие оптимизаторы/обфускаторы, ну а лучше всего, конечно, голову.

  public static final boolean flag = false;
    .....
    
    if (flag) {
       //это код будет выкинут
    }
#333355130
Re[4]: В Мустанге сборка мусора в 2 раза быстрее?
От: Donz Россия http://donz-ru.livejournal.com
Дата: 18.02.06 13:49
Оценка:
Здравствуйте, Lucker, Вы писали:

D>>Ну может кто-то так паузу делает. Ну или производительность тестирует

D>>Насколько я знаю, javac таким не грешит, то есть не слышал о случаях, когда компилятор решил, что кусок кода не нужен, и выкинул его из результирующего байт-кода. Мало ли какая гениальная мысль, непонятая компилятором, там содержалась. Для этих целей надо использовать всякие оптимизаторы/обфускаторы, ну а лучше всего, конечно, голову.

L>
L>  public static final boolean flag = false;
L>    .....
    
L>    if (flag) {
L>       //это код будет выкинут
L>    }
L>


В данном случае кусок кода в принципе недосягаем, не то, короче. Речь идёт о коде, который может быть достигнут, но выполняется "бесполезно".
Re[3]: В Мустанге сборка мусора в 2 раза быстрее?
От: Sserega  
Дата: 18.02.06 14:30
Оценка:
D>Насколько я знаю, javac таким не грешит, то есть не слышал о случаях, когда компилятор решил, что кусок кода не нужен, и выкинул его из результирующего байт-кода. Мало ли какая гениальная мысль, непонятая компилятором, там содержалась. Для этих целей надо использовать всякие оптимизаторы/обфускаторы, ну а лучше всего, конечно, голову.

Компилятор, может и нет, а вот jvm с этим справляется, например запущенная с опцией -server благополучно оптимизирует этот код:
private void test() {
  int a = 0;
  for (int i=0; i<100000000; i++){
    a = a +1;
  }
}
Re[4]: В Мустанге сборка мусора в 2 раза быстрее?
От: Donz Россия http://donz-ru.livejournal.com
Дата: 18.02.06 14:48
Оценка:
Здравствуйте, 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 сразу таким, каким оно должно быть после выполнения цикла? И как это выяснилось?
Re[5]: В Мустанге сборка мусора в 2 раза быстрее?
От: Sserega  
Дата: 18.02.06 15:17
Оценка: 3 (1)
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.