powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Производительность рефлексии
22 сообщений из 22, страница 1 из 1
Производительность рефлексии
    #38444330
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как известно, oracle работает над повышением производительности java, а еще известно что написать правильно тест, чтобы сравнить производительности, бывает сложно.
Но это относится к тестам в рамках одной jvm, а если мы одинаковой программой будем тестить разные jvm, то можно судить о том какая jvm лучше. Или нельзя? Когда разработчик переходит на более новую jvm, он привык надеяться, что она будет по крайней мере не хуже старой. Или если хуже, то неособо. А если сильно хуже, то нас предупредят. Но можно ли на самом деле на это надеяться? Или нельзя?

Возьмем следующую программу

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
package javaapplication1;

import java.lang.reflect.Method;

public class Test1 {
    
    static class Incrementer {
        public long incrementedNumber=0;        
        public void increment(String arg) {
            incrementedNumber++;
        }
    }

    static Incrementer increments = new Incrementer();
    
    public static void main(String[] args) throws Throwable {
        for(int i=0; i<20; i++){
            reflTest();
        }
    }

    private static void reflTest() throws Exception {
        Method method = Incrementer.class.getMethod("increment", String.class);
        long startTime = System.currentTimeMillis();        
        for (int i = 0; i < 1000000; i++) {
            method.invoke(increments, "12345");
        }
        long elapsed = System.currentTimeMillis() - startTime;
        System.out.println(System.getProperty("java.version")+" test took " + elapsed + "ms, result is " + increments.incrementedNumber);
    }
    
}



И запустим на 1.7.0_21 и тех что чуть раньше, а потом на 1.7.0_25 или тех что позже, включая текущий релиз.

1.7.0_45 test took 285ms, result is 20000000
1.7.0_40 test took 295ms, result is 20000000
1.7.0_25 test took 314ms, result is 20000000
1.7.0_21 test took 4ms, result is 20000000
1.7.0_07 test took 5ms, result is 20000000

решил и 1.6 попробовать, просто для сравнения.
1.6.0_37 test took 22ms, result is 20000000

Все jvm серверные х64.
Как видно, новее - далеко это не всегда лучше. Заставить новые jdk работать со скоростью старой так и не вышло. Запускал многократно, итераций прбовал делать под тыщу...

Они убили кении сломали рефлексию.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444346
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно.

Попробуй поиграть с опциями Performance
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

Возможно от одной минорной версии к другой менялись какие-то defaults.

Плюс нужно смотреть еще и на сам компиллятор.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444485
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
chabapok,

Выполнил на двух идентичных компьютерах, из одной партии. Это на компе коллеги
1.7.0_111.7.0_11 test took 208ms, result is 1000000
1.7.0_11 test took 197ms, result is 2000000
1.7.0_11 test took 57ms, result is 3000000
1.7.0_11 test took 4ms, result is 4000000
1.7.0_11 test took 5ms, result is 5000000
1.7.0_11 test took 6ms, result is 6000000
1.7.0_11 test took 5ms, result is 7000000
1.7.0_11 test took 4ms, result is 8000000
1.7.0_11 test took 12ms, result is 9000000
1.7.0_11 test took 14ms, result is 10000000
1.7.0_11 test took 13ms, result is 11000000
1.7.0_11 test took 5ms, result is 12000000
1.7.0_11 test took 5ms, result is 13000000
1.7.0_11 test took 4ms, result is 14000000
1.7.0_11 test took 5ms, result is 15000000
1.7.0_11 test took 5ms, result is 16000000
1.7.0_11 test took 5ms, result is 17000000
1.7.0_11 test took 5ms, result is 18000000
1.7.0_11 test took 5ms, result is 19000000
1.7.0_11 test took 5ms, result is 20000000

А это на своем собственном
1.7.0_251.7.0_25 test took 180ms, result is 1000000
1.7.0_25 test took 178ms, result is 2000000
1.7.0_25 test took 174ms, result is 3000000
1.7.0_25 test took 168ms, result is 4000000
1.7.0_25 test took 167ms, result is 5000000
1.7.0_25 test took 168ms, result is 6000000
1.7.0_25 test took 168ms, result is 7000000
1.7.0_25 test took 167ms, result is 8000000
1.7.0_25 test took 167ms, result is 9000000
1.7.0_25 test took 165ms, result is 10000000
1.7.0_25 test took 166ms, result is 11000000
1.7.0_25 test took 165ms, result is 12000000
1.7.0_25 test took 165ms, result is 13000000
1.7.0_25 test took 165ms, result is 14000000
1.7.0_25 test took 166ms, result is 15000000
1.7.0_25 test took 165ms, result is 16000000
1.7.0_25 test took 165ms, result is 17000000
1.7.0_25 test took 166ms, result is 18000000
1.7.0_25 test took 166ms, result is 19000000
1.7.0_25 test took 165ms, result is 20000000
ИМХО, результаты синтетических тестов слегка неправдоподобны. Вряд ли в реальной жизни Вы будете одну и ту же простейшую задачку выполнять более десяти раз подряд. Так что если судить по первым итерациям, то JVM 1.7.0_25 лучше 11-й...
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444493
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я на 95% уверен, что ничего не сломано, а, как уже было сказано выше, просто сменились какие-то дефолты. Поищите на Хбаре - там была статейка о том, как распечатать на бегущей JVMке значения всех ее ключей. Потом сравните эти ключики там и там.
Так же могли измениться какие-нибудь стратегии по оптимизациям. Можно посмотреть на оутпут компилятора, можно посмотреть на то, не подключаются ли какие-нибудь интринсики, и т.д.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444799
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WGAВряд ли в реальной жизни Вы будете одну и ту же простейшую задачку выполнять более десяти раз подряд. Так что если судить по первым итерациям, то JVM 1.7.0_25 лучше 11-й...
Там миллион каллбеков. В таком кейсе если это действительно бутылочное
горло в софте то оптимизируют не сам каллбек а код в целом.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444849
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokОни убили кении сломали рефлексию.
По логам видно, что отключили какую-то jit-оптимизацию, применявшуюся при большом количестве повторений. Скорее всего, наткнулись на случай, когда она приводила к ошибкам.

Вообще-то если вам нужна скорость, то попытайтесь обойтись без рефлексии. Есть же всякие паттерны типа double dispatch.
Если не получится, то можно в прямо в памяти соорудить промежуточный класс с вызовом нужного метода.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444874
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

У Sun (теперь уже у оракла) есть громадный тестовый фреймворк на тестирование Java, как функциональное, так, я подозреваю, и производительности.

Вот его и гоняют на всех реализациях.

Что касается производительности reflection -- его вообще обсуждать нет смысла. Relection заведомо непроизводителен. Но иногда полезен, за чем он и существует.

Для тестирования его на производительность, я уверен, у соотв. людей есть соотв. проверенные и сертифицированные тесты.
Тебе об этом думаю беспокоиться не стоит.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444883
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И зачем константа "12345" передаётся? Как она участвует в тесте? Как балласт чтоли?
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444948
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По-моему тест скорее показывает не время вызова метода через reflection, а как быстро jit догадается что незачем 1000000 раз инкрементировать поле, а можно просто прибавить к нему 1000000 (О чём говорит время в 0ms в режиме server'а).

Прогнал этот тест (убрал правда String параметр из метода) на одном и том же железе. Перед тем как прогонять тест откатывал Acronis'ом систему (winXP sp3 x86, где нет ничего кроме драйверов и текстового редактора) ставил JVM (т.е. шум от других факторов должен быть минимальным).

1.7.0_09
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_09 test took 437ms, result is 1000000
1.7.0_09 test took 422ms, result is 2000000
1.7.0_09 test took 422ms, result is 3000000
1.7.0_09 test took 422ms, result is 4000000
1.7.0_09 test took 422ms, result is 5000000
1.7.0_09 test took 422ms, result is 6000000
1.7.0_09 test took 437ms, result is 7000000
1.7.0_09 test took 422ms, result is 8000000
1.7.0_09 test took 422ms, result is 9000000
1.7.0_09 test took 422ms, result is 10000000
1.7.0_09 test took 437ms, result is 11000000
1.7.0_09 test took 422ms, result is 12000000
1.7.0_09 test took 422ms, result is 13000000
1.7.0_09 test took 422ms, result is 14000000
1.7.0_09 test took 422ms, result is 15000000
1.7.0_09 test took 422ms, result is 16000000
1.7.0_09 test took 437ms, result is 17000000
1.7.0_09 test took 422ms, result is 18000000
1.7.0_09 test took 422ms, result is 19000000
1.7.0_09 test took 438ms, result is 20000000

1.7.0_09 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_09 test took 31ms, result is 1000000
1.7.0_09 test took 32ms, result is 2000000
1.7.0_09 test took 0ms, result is 3000000
1.7.0_09 test took 0ms, result is 4000000
1.7.0_09 test took 15ms, result is 5000000
1.7.0_09 test took 0ms, result is 6000000
1.7.0_09 test took 16ms, result is 7000000
1.7.0_09 test took 0ms, result is 8000000
1.7.0_09 test took 0ms, result is 9000000
1.7.0_09 test took 16ms, result is 10000000
1.7.0_09 test took 0ms, result is 11000000
1.7.0_09 test took 15ms, result is 12000000
1.7.0_09 test took 0ms, result is 13000000
1.7.0_09 test took 0ms, result is 14000000
1.7.0_09 test took 16ms, result is 15000000
1.7.0_09 test took 0ms, result is 16000000
1.7.0_09 test took 15ms, result is 17000000
1.7.0_09 test took 0ms, result is 18000000
1.7.0_09 test took 0ms, result is 19000000
1.7.0_09 test took 16ms, result is 20000000


1.7.0_10
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_10 test took 422ms, result is 1000000
1.7.0_10 test took 422ms, result is 2000000
1.7.0_10 test took 422ms, result is 3000000
1.7.0_10 test took 422ms, result is 4000000
1.7.0_10 test took 422ms, result is 5000000
1.7.0_10 test took 422ms, result is 6000000
1.7.0_10 test took 422ms, result is 7000000
1.7.0_10 test took 437ms, result is 8000000
1.7.0_10 test took 422ms, result is 9000000
1.7.0_10 test took 437ms, result is 10000000
1.7.0_10 test took 422ms, result is 11000000
1.7.0_10 test took 422ms, result is 12000000
1.7.0_10 test took 422ms, result is 13000000
1.7.0_10 test took 438ms, result is 14000000
1.7.0_10 test took 421ms, result is 15000000
1.7.0_10 test took 422ms, result is 16000000
1.7.0_10 test took 422ms, result is 17000000
1.7.0_10 test took 438ms, result is 18000000
1.7.0_10 test took 422ms, result is 19000000
1.7.0_10 test took 421ms, result is 20000000

1.7.0_10 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_10 test took 47ms, result is 1000000
1.7.0_10 test took 15ms, result is 2000000
1.7.0_10 test took 16ms, result is 3000000
1.7.0_10 test took 0ms, result is 4000000
1.7.0_10 test took 16ms, result is 5000000
1.7.0_10 test took 0ms, result is 6000000
1.7.0_10 test took 15ms, result is 7000000
1.7.0_10 test took 0ms, result is 8000000
1.7.0_10 test took 0ms, result is 9000000
1.7.0_10 test took 16ms, result is 10000000
1.7.0_10 test took 0ms, result is 11000000
1.7.0_10 test took 16ms, result is 12000000
1.7.0_10 test took 0ms, result is 13000000
1.7.0_10 test took 0ms, result is 14000000
1.7.0_10 test took 15ms, result is 15000000
1.7.0_10 test took 0ms, result is 16000000
1.7.0_10 test took 16ms, result is 17000000
1.7.0_10 test took 0ms, result is 18000000
1.7.0_10 test took 0ms, result is 19000000
1.7.0_10 test took 15ms, result is 20000000


1.7.0_11
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_11 test took 422ms, result is 1000000
1.7.0_11 test took 421ms, result is 2000000
1.7.0_11 test took 422ms, result is 3000000
1.7.0_11 test took 422ms, result is 4000000
1.7.0_11 test took 422ms, result is 5000000
1.7.0_11 test took 422ms, result is 6000000
1.7.0_11 test took 422ms, result is 7000000
1.7.0_11 test took 422ms, result is 8000000
1.7.0_11 test took 437ms, result is 9000000
1.7.0_11 test took 422ms, result is 10000000
1.7.0_11 test took 422ms, result is 11000000
1.7.0_11 test took 422ms, result is 12000000
1.7.0_11 test took 437ms, result is 13000000
1.7.0_11 test took 422ms, result is 14000000
1.7.0_11 test took 422ms, result is 15000000
1.7.0_11 test took 422ms, result is 16000000
1.7.0_11 test took 437ms, result is 17000000
1.7.0_11 test took 422ms, result is 18000000
1.7.0_11 test took 422ms, result is 19000000
1.7.0_11 test took 422ms, result is 20000000

1.7.0_11 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_11 test took 31ms, result is 1000000
1.7.0_11 test took 31ms, result is 2000000
1.7.0_11 test took 0ms, result is 3000000
1.7.0_11 test took 16ms, result is 4000000
1.7.0_11 test took 0ms, result is 5000000
1.7.0_11 test took 0ms, result is 6000000
1.7.0_11 test took 16ms, result is 7000000
1.7.0_11 test took 0ms, result is 8000000
1.7.0_11 test took 15ms, result is 9000000
1.7.0_11 test took 0ms, result is 10000000
1.7.0_11 test took 0ms, result is 11000000
1.7.0_11 test took 16ms, result is 12000000
1.7.0_11 test took 0ms, result is 13000000
1.7.0_11 test took 16ms, result is 14000000
1.7.0_11 test took 0ms, result is 15000000
1.7.0_11 test took 0ms, result is 16000000
1.7.0_11 test took 15ms, result is 17000000
1.7.0_11 test took 0ms, result is 18000000
1.7.0_11 test took 16ms, result is 19000000
1.7.0_11 test took 0ms, result is 20000000


1.7.0_21
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_21 test took 453ms, result is 1000000
1.7.0_21 test took 438ms, result is 2000000
1.7.0_21 test took 437ms, result is 3000000
1.7.0_21 test took 422ms, result is 4000000
1.7.0_21 test took 438ms, result is 5000000
1.7.0_21 test took 453ms, result is 6000000
1.7.0_21 test took 453ms, result is 7000000
1.7.0_21 test took 453ms, result is 8000000
1.7.0_21 test took 438ms, result is 9000000
1.7.0_21 test took 453ms, result is 10000000
1.7.0_21 test took 437ms, result is 11000000
1.7.0_21 test took 453ms, result is 12000000
1.7.0_21 test took 438ms, result is 13000000
1.7.0_21 test took 453ms, result is 14000000
1.7.0_21 test took 437ms, result is 15000000
1.7.0_21 test took 454ms, result is 16000000
1.7.0_21 test took 437ms, result is 17000000
1.7.0_21 test took 453ms, result is 18000000
1.7.0_21 test took 438ms, result is 19000000
1.7.0_21 test took 453ms, result is 20000000

1.7.0_21 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_21 test took 47ms, result is 1000000
1.7.0_21 test took 31ms, result is 2000000
1.7.0_21 test took 0ms, result is 3000000
1.7.0_21 test took 15ms, result is 4000000
1.7.0_21 test took 0ms, result is 5000000
1.7.0_21 test took 0ms, result is 6000000
1.7.0_21 test took 16ms, result is 7000000
1.7.0_21 test took 0ms, result is 8000000
1.7.0_21 test took 16ms, result is 9000000
1.7.0_21 test took 0ms, result is 10000000
1.7.0_21 test took 0ms, result is 11000000
1.7.0_21 test took 15ms, result is 12000000
1.7.0_21 test took 0ms, result is 13000000
1.7.0_21 test took 16ms, result is 14000000
1.7.0_21 test took 0ms, result is 15000000
1.7.0_21 test took 0ms, result is 16000000
1.7.0_21 test took 16ms, result is 17000000
1.7.0_21 test took 0ms, result is 18000000
1.7.0_21 test took 15ms, result is 19000000
1.7.0_21 test took 0ms, result is 20000000


1.7.0_25
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_25 test took 469ms, result is 1000000
1.7.0_25 test took 453ms, result is 2000000
1.7.0_25 test took 453ms, result is 3000000
1.7.0_25 test took 453ms, result is 4000000
1.7.0_25 test took 469ms, result is 5000000
1.7.0_25 test took 469ms, result is 6000000
1.7.0_25 test took 469ms, result is 7000000
1.7.0_25 test took 453ms, result is 8000000
1.7.0_25 test took 468ms, result is 9000000
1.7.0_25 test took 469ms, result is 10000000
1.7.0_25 test took 469ms, result is 11000000
1.7.0_25 test took 469ms, result is 12000000
1.7.0_25 test took 468ms, result is 13000000
1.7.0_25 test took 454ms, result is 14000000
1.7.0_25 test took 468ms, result is 15000000
1.7.0_25 test took 469ms, result is 16000000
1.7.0_25 test took 469ms, result is 17000000
1.7.0_25 test took 469ms, result is 18000000
1.7.0_25 test took 453ms, result is 19000000
1.7.0_25 test took 468ms, result is 20000000

1.7.0_25 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_25 test took 343ms, result is 1000000
1.7.0_25 test took 313ms, result is 2000000
1.7.0_25 test took 328ms, result is 3000000
1.7.0_25 test took 312ms, result is 4000000
1.7.0_25 test took 313ms, result is 5000000
1.7.0_25 test took 312ms, result is 6000000
1.7.0_25 test took 329ms, result is 7000000
1.7.0_25 test took 296ms, result is 8000000
1.7.0_25 test took 313ms, result is 9000000
1.7.0_25 test took 312ms, result is 10000000
1.7.0_25 test took 313ms, result is 11000000
1.7.0_25 test took 312ms, result is 12000000
1.7.0_25 test took 313ms, result is 13000000
1.7.0_25 test took 312ms, result is 14000000
1.7.0_25 test took 313ms, result is 15000000
1.7.0_25 test took 297ms, result is 16000000
1.7.0_25 test took 312ms, result is 17000000
1.7.0_25 test took 313ms, result is 18000000
1.7.0_25 test took 297ms, result is 19000000
1.7.0_25 test took 312ms, result is 20000000


1.7.0_40
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_40 test took 485ms, result is 1000000
1.7.0_40 test took 484ms, result is 2000000
1.7.0_40 test took 484ms, result is 3000000
1.7.0_40 test took 485ms, result is 4000000
1.7.0_40 test took 484ms, result is 5000000
1.7.0_40 test took 469ms, result is 6000000
1.7.0_40 test took 484ms, result is 7000000
1.7.0_40 test took 453ms, result is 8000000
1.7.0_40 test took 469ms, result is 9000000
1.7.0_40 test took 469ms, result is 10000000
1.7.0_40 test took 469ms, result is 11000000
1.7.0_40 test took 468ms, result is 12000000
1.7.0_40 test took 485ms, result is 13000000
1.7.0_40 test took 484ms, result is 14000000
1.7.0_40 test took 469ms, result is 15000000
1.7.0_40 test took 484ms, result is 16000000
1.7.0_40 test took 485ms, result is 17000000
1.7.0_40 test took 468ms, result is 18000000
1.7.0_40 test took 485ms, result is 19000000
1.7.0_40 test took 484ms, result is 20000000

1.7.0_40 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_40 test took 344ms, result is 1000000
1.7.0_40 test took 328ms, result is 2000000
1.7.0_40 test took 328ms, result is 3000000
1.7.0_40 test took 313ms, result is 4000000
1.7.0_40 test took 312ms, result is 5000000
1.7.0_40 test took 313ms, result is 6000000
1.7.0_40 test took 312ms, result is 7000000
1.7.0_40 test took 313ms, result is 8000000
1.7.0_40 test took 312ms, result is 9000000
1.7.0_40 test took 313ms, result is 10000000
1.7.0_40 test took 328ms, result is 11000000
1.7.0_40 test took 312ms, result is 12000000
1.7.0_40 test took 313ms, result is 13000000
1.7.0_40 test took 328ms, result is 14000000
1.7.0_40 test took 313ms, result is 15000000
1.7.0_40 test took 312ms, result is 16000000
1.7.0_40 test took 313ms, result is 17000000
1.7.0_40 test took 328ms, result is 18000000
1.7.0_40 test took 312ms, result is 19000000
1.7.0_40 test took 313ms, result is 20000000


1.7.0_45
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_45 test took 469ms, result is 1000000
1.7.0_45 test took 469ms, result is 2000000
1.7.0_45 test took 453ms, result is 3000000
1.7.0_45 test took 453ms, result is 4000000
1.7.0_45 test took 453ms, result is 5000000
1.7.0_45 test took 469ms, result is 6000000
1.7.0_45 test took 453ms, result is 7000000
1.7.0_45 test took 453ms, result is 8000000
1.7.0_45 test took 453ms, result is 9000000
1.7.0_45 test took 453ms, result is 10000000
1.7.0_45 test took 454ms, result is 11000000
1.7.0_45 test took 468ms, result is 12000000
1.7.0_45 test took 453ms, result is 13000000
1.7.0_45 test took 469ms, result is 14000000
1.7.0_45 test took 453ms, result is 15000000
1.7.0_45 test took 453ms, result is 16000000
1.7.0_45 test took 454ms, result is 17000000
1.7.0_45 test took 468ms, result is 18000000
1.7.0_45 test took 453ms, result is 19000000
1.7.0_45 test took 454ms, result is 20000000

1.7.0_45 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.7.0_45 test took 343ms, result is 1000000
1.7.0_45 test took 329ms, result is 2000000
1.7.0_45 test took 328ms, result is 3000000
1.7.0_45 test took 312ms, result is 4000000
1.7.0_45 test took 313ms, result is 5000000
1.7.0_45 test took 297ms, result is 6000000
1.7.0_45 test took 312ms, result is 7000000
1.7.0_45 test took 297ms, result is 8000000
1.7.0_45 test took 312ms, result is 9000000
1.7.0_45 test took 297ms, result is 10000000
1.7.0_45 test took 313ms, result is 11000000
1.7.0_45 test took 297ms, result is 12000000
1.7.0_45 test took 297ms, result is 13000000
1.7.0_45 test took 312ms, result is 14000000
1.7.0_45 test took 297ms, result is 15000000
1.7.0_45 test took 312ms, result is 16000000
1.7.0_45 test took 313ms, result is 17000000
1.7.0_45 test took 297ms, result is 18000000
1.7.0_45 test took 312ms, result is 19000000
1.7.0_45 test took 297ms, result is 20000000


1.8.0-ea 4_jul_2013
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.8.0-ea test took 390ms, result is 1000000
1.8.0-ea test took 391ms, result is 2000000
1.8.0-ea test took 422ms, result is 3000000
1.8.0-ea test took 406ms, result is 4000000
1.8.0-ea test took 391ms, result is 5000000
1.8.0-ea test took 390ms, result is 6000000
1.8.0-ea test took 438ms, result is 7000000
1.8.0-ea test took 406ms, result is 8000000
1.8.0-ea test took 422ms, result is 9000000
1.8.0-ea test took 437ms, result is 10000000
1.8.0-ea test took 391ms, result is 11000000
1.8.0-ea test took 422ms, result is 12000000
1.8.0-ea test took 422ms, result is 13000000
1.8.0-ea test took 422ms, result is 14000000
1.8.0-ea test took 421ms, result is 15000000
1.8.0-ea test took 454ms, result is 16000000
1.8.0-ea test took 406ms, result is 17000000
1.8.0-ea test took 406ms, result is 18000000
1.8.0-ea test took 422ms, result is 19000000
1.8.0-ea test took 406ms, result is 20000000

1.8.0-ea 4_jul_2013 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.8.0-ea test took 46ms, result is 1000000
1.8.0-ea test took 32ms, result is 2000000
1.8.0-ea test took 0ms, result is 3000000
1.8.0-ea test took 15ms, result is 4000000
1.8.0-ea test took 0ms, result is 5000000
1.8.0-ea test took 16ms, result is 6000000
1.8.0-ea test took 0ms, result is 7000000
1.8.0-ea test took 0ms, result is 8000000
1.8.0-ea test took 16ms, result is 9000000
1.8.0-ea test took 0ms, result is 10000000
1.8.0-ea test took 15ms, result is 11000000
1.8.0-ea test took 0ms, result is 12000000
1.8.0-ea test took 16ms, result is 13000000
1.8.0-ea test took 0ms, result is 14000000
1.8.0-ea test took 0ms, result is 15000000
1.8.0-ea test took 15ms, result is 16000000
1.8.0-ea test took 0ms, result is 17000000
1.8.0-ea test took 16ms, result is 18000000
1.8.0-ea test took 0ms, result is 19000000
1.8.0-ea test took 0ms, result is 20000000


1.8.0-ea 17_oct_2013
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.8.0-ea test took 391ms, result is 1000000
1.8.0-ea test took 375ms, result is 2000000
1.8.0-ea test took 375ms, result is 3000000
1.8.0-ea test took 375ms, result is 4000000
1.8.0-ea test took 375ms, result is 5000000
1.8.0-ea test took 375ms, result is 6000000
1.8.0-ea test took 375ms, result is 7000000
1.8.0-ea test took 375ms, result is 8000000
1.8.0-ea test took 375ms, result is 9000000
1.8.0-ea test took 390ms, result is 10000000
1.8.0-ea test took 375ms, result is 11000000
1.8.0-ea test took 375ms, result is 12000000
1.8.0-ea test took 375ms, result is 13000000
1.8.0-ea test took 375ms, result is 14000000
1.8.0-ea test took 375ms, result is 15000000
1.8.0-ea test took 375ms, result is 16000000
1.8.0-ea test took 375ms, result is 17000000
1.8.0-ea test took 375ms, result is 18000000
1.8.0-ea test took 375ms, result is 19000000
1.8.0-ea test took 375ms, result is 20000000

1.8.0-ea 17_oct_2013 -server
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
1.8.0-ea test took 62ms, result is 1000000
1.8.0-ea test took 47ms, result is 2000000
1.8.0-ea test took 0ms, result is 3000000
1.8.0-ea test took 16ms, result is 4000000
1.8.0-ea test took 0ms, result is 5000000
1.8.0-ea test took 0ms, result is 6000000
1.8.0-ea test took 15ms, result is 7000000
1.8.0-ea test took 0ms, result is 8000000
1.8.0-ea test took 16ms, result is 9000000
1.8.0-ea test took 0ms, result is 10000000
1.8.0-ea test took 0ms, result is 11000000
1.8.0-ea test took 16ms, result is 12000000
1.8.0-ea test took 0ms, result is 13000000
1.8.0-ea test took 15ms, result is 14000000
1.8.0-ea test took 0ms, result is 15000000
1.8.0-ea test took 0ms, result is 16000000
1.8.0-ea test took 16ms, result is 17000000
1.8.0-ea test took 0ms, result is 18000000
1.8.0-ea test took 15ms, result is 19000000
1.8.0-ea test took 0ms, result is 20000000

...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444956
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где 0 милисекунд - какой-то фейк. Вот тут уж точно его хотелось бы увидеть после JIT-обработки.

Крутил -XX:CompileThreshold ?
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444970
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На 1.7.0_25, 1.7.0_40 и 1.7.0_45 - на данном тесте действительно не догадывается..

maytonГде 0 милисекунд - какой-то фейк. Вот тут уж точно его хотелось бы увидеть после JIT-обработки.

Крутил -XX:CompileThreshold ?
Нет. Запустил с ключом -server
Код: sql
1.
C:\JDK\bin\java -jar -server ReflectionTest.jar
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38444974
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уверен. Но кажется опция -server это просто набор пресетов для других опций.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38445287
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Опции server и client - это выбор серверной или клиентской jvm. На видео jug кто-то говорил, что все оптимизации "нормально" делаются только на серверной машине. На клиентской много чего нету, по сути урезаный вариант, и настройки профилей тоже другие.

WGA,
>Вряд ли в реальной жизни Вы будете одну и ту же простейшую задачку выполнять более десяти раз подряд.
Зависит что считать простейшей задачей. Метод invorke в реальной жизни может вызываться много раз при старте приложения. В том числе, десятки тысяч раз. Если так то такой чудовищный анперфомас хоть и не смерть, но очень даже заметен.

Судя по тестам на 1.8 они снова это починили. Получается, что когда они это ломают, то "в реальной жизни вы вряд ли будете запускать рефлексию часто". А когда они это чинят, то "мы работаем даже над проиводительностью рефлексии". Больше всего мне это напоминает известный анекдот -- "купи слона а потом продай и почувствуй как стало легко".

Кстати, печать всех флагов делается опцией -XX:+PrintFlagsFinal к ним советуют добавить -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions
Я распечатал, параметры были все одинаковые кроме двух -- MaxPermSize (на 1.7.0-21 он 80мб, на 1.7.0-25 -- 170мб),
и в 21 есть bool UseFastUnorderedTimeStamps я не знаю что это, но в 25 его нету.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38445350
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, да, я перепутал. То, о чем я говорил, была статейка на тему того, как менять эти флаги в бегущей JVMке - http://habrahabr.ru/company/mailru/blog/195004/
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38445406
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokМетод invorke в реальной жизни может вызываться много раз при старте приложения. В том числе, десятки тысяч раз. Если так то такой чудовищный анперфомас хоть и не смерть, но очень даже заметен.
В отложенной оптимизации горячих циклов есть какой-то особый трезвый расчёт. Мы не тратим
время на компилляций байткода в машинынй а мгновенно получаем маркер исполнения.
Это весьма полезно для конструкторов и одноразовых блоков кода типа скриптов, сценариев
и мастер-джобов. Если-бы мы ставили себе задачу пересобрать всё в бинарь до очень
долго ожидали-бы старт веб-сервера к примеру.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38445475
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
chabapokWGA,
>Вряд ли в реальной жизни Вы будете одну и ту же простейшую задачку выполнять более десяти раз подряд.
Зависит что считать простейшей задачей. Метод invorke в реальной жизни может вызываться много раз при старте приложения. В том числе, десятки тысяч раз. Если так то такой чудовищный анперфомас хоть и не смерть, но очень даже заметен.Нагрузка, которую Вы предложили JVM - нетипична. Пожалуй, соглашусь, с автором
rfq По логам видно, что отключили какую-то jit-оптимизацию, применявшуюся при большом количестве повторений. Скорее всего, наткнулись на случай, когда она приводила к ошибкам.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38445772
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
apangin http://habrahabr.ru/post/111897/#comment_3577272 Если вкратце, начиная с Java 1.4 применяется так называемый New Reflection, основанный на динамической генерации байткодов. Традиционно вызовы Method.invoke(), Field.getXXX() и т.п. реализовывались в виде native-методов, которые обращались к JVM, поэтому каждый такой вызов сопровождался переключением контекста Java->Native->JVM->Java, причем на каждый invoke() надо было проверять тип аргументов метода. В новом refelction, если количество вызовов Method.invoke(), Field.getXXX() и т.п. превысит определенный порог, для данного метода или поля динамически генерируется вспомогательный Java класс — аксессор, умеющий с помощью sun.misc.Unsafe напрямую обращаться к полю или вызывать Java метод, зная, какого типа должны быть его параметры, и минуя native-код.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38445913
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok, кажется мне удалось воспроизвести твою ситуацию. Думаю что там где был
резкий прирост производительности работала как раз -client машина. Или ее оптимизация.

Смотрим. Я добавил вывод кое-каких Sys.props. чтобы быть точным и взял две разных JVM.

Пусковой скриптик.
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set JROCKIT_HOME=C:\jrockit-jdk1.6.0
set CLASSPATH=.;%JROCKIT_HOME%\jre\lib

%JROCKIT_HOME%\bin\javac  -d . Test1.java

%JROCKIT_HOME%\jre\bin\java -server  javaapplication1.Test1

%JROCKIT_HOME%\jre\bin\java -client  javaapplication1.Test1

set JAVA_HOME=C:\jdk1.7.0_13
set CLASSPATH=.;%JAVA_HOME%;\jre\lib

%JAVA_HOME%\jre\bin\java -server  javaapplication1.Test1

%JAVA_HOME%\jre\bin\java -client  javaapplication1.Test1


Изменённый исходник.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
package javaapplication1;

import java.lang.reflect.Method;

public class Test1 {
    
    static class Incrementer {
        public long incrementedNumber=0;        
        public void increment(String arg) {
            incrementedNumber++;
        }
    }

    static Incrementer increments = new Incrementer();

    public static void main(String[] args) throws Throwable {
        System.out.println("java.version:         "+System.getProperty("java.version"));
        System.out.println("java.vm.version:      "+System.getProperty("java.vm.version"));
        System.out.println("java.vm.name:         "+System.getProperty("java.vm.name"));
        System.out.println("java.vm.info:         "+System.getProperty("java.vm.info"));
        System.out.println("java.runtime.version: "+System.getProperty("java.runtime.version"));
        System.out.println("os.arch:              "+System.getProperty("os.arch"));
        System.out.println("sun.arch.data.model:  "+System.getProperty("sun.arch.data.model"));
        System.out.println("sun.cpu.isalist:      "+System.getProperty("sun.cpu.isalist"));
        System.out.println("java.endorsed.dirs:   "+System.getProperty("java.endorsed.dirs"));



        for(int i=0; i<20; i++){
            reflTest();
        }
    }


    private static void reflTest() throws Exception {
        Method method = Incrementer.class.getMethod("increment", String.class);
        long startTime = System.currentTimeMillis();        
        for (int i = 0; i < 1000000; i++) {
            method.invoke(increments, "12345");
        }
        long elapsed = System.currentTimeMillis() - startTime;
        System.out.println("Test took " + elapsed + "ms, result is " + increments.incrementedNumber);
    }
    
}


Отчётик.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
C:\java_soft\Test1>C:\jrockit-jdk1.6.0\jre\bin\java -server  javaapplication1.Test1 
java.version:         1.6.0_45
java.vm.version:      R28.2.7-7-155314-1.6.0_45-20130329-0646-windows-x86_64
java.vm.name:         Oracle JRockit(R)
java.vm.info:         compiled mode
java.runtime.version: 1.6.0_45-b06
os.arch:              amd64
sun.arch.data.model:  64
sun.cpu.isalist:      amd64
java.endorsed.dirs:   C:\jrockit-jdk1.6.0\jre\lib\endorsed
Test took 329ms, result is 1000000
Test took 309ms, result is 2000000
Test took 300ms, result is 3000000
Test took 301ms, result is 4000000
Test took 301ms, result is 5000000
Test took 301ms, result is 6000000
Test took 302ms, result is 7000000
Test took 297ms, result is 8000000
Test took 309ms, result is 9000000
Test took 325ms, result is 10000000
Test took 250ms, result is 11000000
Test took 240ms, result is 12000000
Test took 241ms, result is 13000000
Test took 246ms, result is 14000000
Test took 246ms, result is 15000000
Test took 245ms, result is 16000000
Test took 240ms, result is 17000000
Test took 245ms, result is 18000000
Test took 239ms, result is 19000000
Test took 245ms, result is 20000000

C:\java_soft\Test1>C:\jrockit-jdk1.6.0\jre\bin\java -client  javaapplication1.Test1 
java.version:         1.6.0_45
java.vm.version:      R28.2.7-7-155314-1.6.0_45-20130329-0646-windows-x86_64
java.vm.name:         Oracle JRockit(R)
java.vm.info:         compiled mode
java.runtime.version: 1.6.0_45-b06
os.arch:              amd64
sun.arch.data.model:  64
sun.cpu.isalist:      amd64
java.endorsed.dirs:   C:\jrockit-jdk1.6.0\jre\lib\endorsed
Test took 322ms, result is 1000000
Test took 300ms, result is 2000000
Test took 302ms, result is 3000000
Test took 301ms, result is 4000000
Test took 299ms, result is 5000000
Test took 300ms, result is 6000000
Test took 301ms, result is 7000000
Test took 302ms, result is 8000000
Test took 301ms, result is 9000000
Test took 327ms, result is 10000000
Test took 246ms, result is 11000000
Test took 243ms, result is 12000000
Test took 247ms, result is 13000000
Test took 245ms, result is 14000000
Test took 245ms, result is 15000000
Test took 244ms, result is 16000000
Test took 271ms, result is 17000000
Test took 246ms, result is 18000000
Test took 241ms, result is 19000000
Test took 241ms, result is 20000000

C:\java_soft\Test1>set JAVA_HOME=C:\jdk1.7.0_13 

C:\java_soft\Test1>set CLASSPATH=.;C:\jdk1.7.0_13;\jre\lib 

C:\java_soft\Test1>C:\jdk1.7.0_13\jre\bin\java -server  javaapplication1.Test1 
java.version:         1.7.0_13
java.vm.version:      23.7-b01
java.vm.name:         Java HotSpot(TM) 64-Bit Server VM
java.vm.info:         mixed mode
java.runtime.version: 1.7.0_13-b20
os.arch:              amd64
sun.arch.data.model:  64
sun.cpu.isalist:      amd64
java.endorsed.dirs:   C:\jdk1.7.0_13\jre\lib\endorsed
Test took 30ms, result is 1000000
Test took 5ms, result is 2000000
Test took 4ms, result is 3000000
Test took 5ms, result is 4000000
Test took 4ms, result is 5000000
Test took 4ms, result is 6000000
Test took 5ms, result is 7000000
Test took 4ms, result is 8000000
Test took 4ms, result is 9000000
Test took 5ms, result is 10000000
Test took 4ms, result is 11000000
Test took 5ms, result is 12000000
Test took 5ms, result is 13000000
Test took 4ms, result is 14000000
Test took 6ms, result is 15000000
Test took 5ms, result is 16000000
Test took 4ms, result is 17000000
Test took 5ms, result is 18000000
Test took 4ms, result is 19000000
Test took 5ms, result is 20000000

C:\java_soft\Test1>C:\jdk1.7.0_13\jre\bin\java -client  javaapplication1.Test1 
java.version:         1.7.0_13
java.vm.version:      23.7-b01
java.vm.name:         Java HotSpot(TM) 64-Bit Server VM
java.vm.info:         mixed mode
java.runtime.version: 1.7.0_13-b20
os.arch:              amd64
sun.arch.data.model:  64
sun.cpu.isalist:      amd64
java.endorsed.dirs:   C:\jdk1.7.0_13\jre\lib\endorsed
Test took 30ms, result is 1000000
Test took 4ms, result is 2000000
Test took 5ms, result is 3000000
Test took 4ms, result is 4000000
Test took 5ms, result is 5000000
Test took 4ms, result is 6000000
Test took 5ms, result is 7000000
Test took 4ms, result is 8000000
Test took 5ms, result is 9000000
Test took 4ms, result is 10000000
Test took 4ms, result is 11000000
Test took 5ms, result is 12000000
Test took 4ms, result is 13000000
Test took 4ms, result is 14000000
Test took 5ms, result is 15000000
Test took 4ms, result is 16000000
Test took 4ms, result is 17000000
Test took 4ms, result is 18000000
Test took 5ms, result is 19000000
Test took 4ms, result is 20000000



Вобщем JDK6-J-ракета "не взлетела". А JDK7+mixed mode оказался внезапно быстр и стремителен.

И мне не удалось порулить переключением везде где хотелось на типы машин
между client/mixed-mode/server/jrockit. Впрочем для теста это уже неважно.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38445943
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,
просто для сведения. Для 64 битной версии клиентской jvm пока не существует, только серверная. Параметры -server, -client ничем не рулят. Насчет JRockit точно не скажу, но видимо тоже
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38446008
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. Я уже было начал считать что это Windows-specific.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38446035
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WGA,

>>>Вряд ли в реальной жизни Вы будете одну и ту же простейшую задачку выполнять более десяти раз подряд.
>>Зависит что считать простейшей задачей. Метод invorke в реальной жизни может вызываться много раз при старте приложения. В том числе, десятки тысяч раз. Если так то такой чудовищный анперфомас хоть и не смерть, но очень даже заметен.
> Нагрузка, которую Вы предложили JVM - нетипична. Пожалуй, соглашусь, с автором

С каким из? вы и есть автор того камента про "более 10 раз подряд"

А в jvm-based языках invorke разве не может использоваться повсеместно? Мне все же кажется, что это баг, а не "так задумали". Ведь посмотрете - в 1.8 судя по тестам выше оно снова быстрое!

>В отложенной оптимизации горячих циклов есть какой-то особый трезвый расчёт. Мы не тратим время на компилляций байткода в машинынй а мгновенно получаем маркер исполнения

Рассчет следующий: при старте приложения обычно запускается сначала часть кода выполняющая функции конфигурирования. Она отрабатывает 1 раз и больше никогда не исполняется. Такое быстрей проинтерпретировать, чем прокомпилить и и выполнить. Компиляция - дорогой процесс. Кто писал на плюсах тот знает. Кроме того, еще не собран профиль выполнения, поэтому откомпилить его можно "как-то" но эффективным это не будет. Это значит, что когда появится профиль его снова надо будет компилить. Клиентскому же приложению надо как можно быстрей запуститься и классов в нем обычно относительно много. Кто запускал шарп тот знает как задалбывает процесс компиляции при запуске. Поэтому разработчики решили на клиенте ставить compileTreshold больше. Чтобы процесс запуска не тормозила компиляция. Сервер же имеет прово запускать дольше, но ему надо работать максимально быстро, поэтому на сервере компилит раньше. (источник: видео с jug.ru плюс различные статьи)

Чтобы узнать когда что компилится есть ключик -XX:+PrintCompilation
Поставим этот ключик программе. (кстати да, параметр "12345" не несет нагрузки, можно выбросить, это я убрать его забыл)


на "медленной" jvm
88 1 n sun.reflect.Reflection::getCallerClass (native) (static)
88 2 java.lang.reflect.Modifier::isPublic (12 bytes)
88 3 n sun.reflect.Reflection::getClassAccessFlags (native) (static)
89 4 sun.reflect.Reflection::quickCheckMemberAccess (10 bytes)
92 5 java.lang.reflect.Modifier::isProtected (12 bytes)
93 6 java.lang.reflect.Method::invoke (63 bytes)
93 7 java.lang.reflect.Method::getCallerClass (4 bytes)
93 8 java.lang.reflect.AccessibleObject::checkAccess (96 bytes)
95 9 sun.reflect.DelegatingMethodAccessorImpl::invoke (10 bytes)
98 10 javaapplication1.Test1$Incrementer::increment (11 bytes)
98 11 ! sun.reflect.GeneratedMethodAccessor1::invoke (62 bytes)
99 12 % javaapplication1.Test1::reflTest @ 19 (97 bytes)
406 12 % javaapplication1.Test1::reflTest @ -2 (97 bytes) made not entrant
1.7.0_45 test took 342ms, result is 1000000
1406 13 javaapplication1.Test1::reflTest (97 bytes)
1406 6 java.lang.reflect.Method::invoke (63 bytes) made not entrant
1417 14 java.lang.reflect.Method::invoke (63 bytes)
1418 15 % javaapplication1.Test1::reflTest @ 19 (97 bytes)
1.7.0_45 test took 314ms, result is 2000000
...
дальше ничего не компилит



на "быстрой" jvm
82 1 n sun.reflect.Reflection::getCallerClass (0 bytes) (static)
82 2 java.lang.reflect.Modifier::isPublic (12 bytes)
82 3 n sun.reflect.Reflection::getClassAccessFlags (0 bytes) (static)
82 4 sun.reflect.Reflection::quickCheckMemberAccess (10 bytes)
85 5 java.lang.reflect.Modifier::isProtected (12 bytes)
86 6 java.lang.reflect.Method::invoke (63 bytes)
86 7 java.lang.reflect.AccessibleObject::checkAccess (96 bytes)
88 8 sun.reflect.DelegatingMethodAccessorImpl::invoke (10 bytes)
89 9 javaapplication1.Test1$Incrementer::increment (11 bytes)
89 10 ! sun.reflect.GeneratedMethodAccessor1::invoke (62 bytes)
90 1 % javaapplication1.Test1::reflTest @ 19 (97 bytes)
100 1 % javaapplication1.Test1::reflTest @ -2 (97 bytes) made not entrant
1.7.0_07 test took 39ms, result is 1000000
100 11 javaapplication1.Test1::reflTest (97 bytes)
100 6 java.lang.reflect.Method::invoke (63 bytes) made not entrant
108 12 java.lang.reflect.Method::invoke (63 bytes)
110 2 % javaapplication1.Test1::reflTest @ 19 (97 bytes)
1.7.0_07 test took 24ms, result is 2000000
1.7.0_07 test took 5ms, result is 3000000
...
дальше ничего не компитит


Тут числа - это время и айди_компиляции, знак % это признак osr-компиляции. (То есть компилит метод и подменяет его исполнение "на лету", до того как происходит из него выход). Знак ! - признак что метод может бросать исключение,буква n - native.

Как видно, компилится практически сразу и почти одинаково. То есть тут явно "отложеную компиляцию" мы прошли.

Дальше можно ставить плагин hsdis и сравнивать его вывод. Но одинаковые размеры методов надоводят на мысль, что (предположительно) скомпилило оно одинаковый код, значит разница где-то в нативном коде внутри jvm.
...
Рейтинг: 0 / 0
Производительность рефлексии
    #38556342
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то java 7 отробатывает всё хуже..

MethodHandle и Reflection
1.7.0_21
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Reflection:
1.7.0_21 test took 440.16703ms, result is 1000000
1.7.0_21 test took 436.76414ms, result is 2000000
1.7.0_21 test took 427.066623ms, result is 3000000
1.7.0_21 test took 434.92957ms, result is 4000000
1.7.0_21 test took 433.079213ms, result is 5000000
1.7.0_21 test took 434.355389ms, result is 6000000
1.7.0_21 test took 431.77262ms, result is 7000000
1.7.0_21 test took 433.995016ms, result is 8000000
1.7.0_21 test took 434.81402ms, result is 9000000
1.7.0_21 test took 432.334828ms, result is 10000000
1.7.0_21 test took 433.921625ms, result is 11000000
1.7.0_21 test took 433.618916ms, result is 12000000
1.7.0_21 test took 436.407711ms, result is 13000000
1.7.0_21 test took 434.007443ms, result is 14000000
1.7.0_21 test took 435.38419ms, result is 15000000
1.7.0_21 test took 433.721609ms, result is 16000000
1.7.0_21 test took 431.073039ms, result is 17000000
1.7.0_21 test took 433.342753ms, result is 18000000
1.7.0_21 test took 433.522888ms, result is 19000000
1.7.0_21 test took 435.75341ms, result is 20000000

MethodHandle:
1.7.0_21 test took 25.90619ms, result is 21000000
1.7.0_21 test took 21.385511ms, result is 22000000
1.7.0_21 test took 20.678779ms, result is 23000000
1.7.0_21 test took 20.639245ms, result is 24000000
1.7.0_21 test took 21.044463ms, result is 25000000
1.7.0_21 test took 20.701741ms, result is 26000000
1.7.0_21 test took 20.635467ms, result is 27000000
1.7.0_21 test took 21.178823ms, result is 28000000
1.7.0_21 test took 20.652833ms, result is 29000000
1.7.0_21 test took 20.633502ms, result is 30000000
1.7.0_21 test took 20.627924ms, result is 31000000
1.7.0_21 test took 20.643243ms, result is 32000000
1.7.0_21 test took 20.629013ms, result is 33000000
1.7.0_21 test took 20.627896ms, result is 34000000
1.7.0_21 test took 20.653132ms, result is 35000000
1.7.0_21 test took 20.628787ms, result is 36000000
1.7.0_21 test took 20.6282ms, result is 37000000
1.7.0_21 test took 20.638822ms, result is 38000000
1.7.0_21 test took 20.638776ms, result is 39000000
1.7.0_21 test took 20.636554ms, result is 40000000

1.7.0_21 -server
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Reflection:
1.7.0_21 test took 47.591295ms, result is 1000000
1.7.0_21 test took 7.091268ms, result is 2000000
1.7.0_21 test took 5.876937ms, result is 3000000
1.7.0_21 test took 6.05734ms, result is 4000000
1.7.0_21 test took 5.693496ms, result is 5000000
1.7.0_21 test took 5.693562ms, result is 6000000
1.7.0_21 test took 5.705381ms, result is 7000000
1.7.0_21 test took 5.693638ms, result is 8000000
1.7.0_21 test took 5.69362ms, result is 9000000
1.7.0_21 test took 5.782294ms, result is 10000000
1.7.0_21 test took 5.874516ms, result is 11000000
1.7.0_21 test took 5.694047ms, result is 12000000
1.7.0_21 test took 5.693425ms, result is 13000000
1.7.0_21 test took 5.871251ms, result is 14000000
1.7.0_21 test took 5.700638ms, result is 15000000
1.7.0_21 test took 5.874352ms, result is 16000000
1.7.0_21 test took 6.048963ms, result is 17000000
1.7.0_21 test took 5.70684ms, result is 18000000
1.7.0_21 test took 5.871189ms, result is 19000000
1.7.0_21 test took 6.058055ms, result is 20000000

MethodHandle:
1.7.0_21 test took 25.649636ms, result is 21000000
1.7.0_21 test took 19.7862ms, result is 22000000
1.7.0_21 test took 19.889209ms, result is 23000000
1.7.0_21 test took 19.774525ms, result is 24000000
1.7.0_21 test took 19.573645ms, result is 25000000
1.7.0_21 test took 19.575705ms, result is 26000000
1.7.0_21 test took 19.563385ms, result is 27000000
1.7.0_21 test took 19.56247ms, result is 28000000
1.7.0_21 test took 19.583966ms, result is 29000000
1.7.0_21 test took 19.57024ms, result is 30000000
1.7.0_21 test took 19.561652ms, result is 31000000
1.7.0_21 test took 19.565606ms, result is 32000000
1.7.0_21 test took 19.718084ms, result is 33000000
1.7.0_21 test took 19.553765ms, result is 34000000
1.7.0_21 test took 19.56505ms, result is 35000000
1.7.0_21 test took 19.584038ms, result is 36000000
1.7.0_21 test took 19.554196ms, result is 37000000
1.7.0_21 test took 19.553673ms, result is 38000000
1.7.0_21 test took 19.553682ms, result is 39000000
1.7.0_21 test took 19.573991ms, result is 40000000


1.7.0_25
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Reflection:
1.7.0_25 test took 472.222865ms, result is 1000000
1.7.0_25 test took 460.797381ms, result is 2000000
1.7.0_25 test took 473.34294ms, result is 3000000
1.7.0_25 test took 481.362389ms, result is 4000000
1.7.0_25 test took 485.391535ms, result is 5000000
1.7.0_25 test took 489.249322ms, result is 6000000
1.7.0_25 test took 491.973111ms, result is 7000000
1.7.0_25 test took 490.513746ms, result is 8000000
1.7.0_25 test took 489.999603ms, result is 9000000
1.7.0_25 test took 489.183322ms, result is 10000000
1.7.0_25 test took 492.794382ms, result is 11000000
1.7.0_25 test took 491.780865ms, result is 12000000
1.7.0_25 test took 489.496751ms, result is 13000000
1.7.0_25 test took 488.900941ms, result is 14000000
1.7.0_25 test took 488.64886ms, result is 15000000
1.7.0_25 test took 487.111877ms, result is 16000000
1.7.0_25 test took 489.155087ms, result is 17000000
1.7.0_25 test took 486.916131ms, result is 18000000
1.7.0_25 test took 489.54488ms, result is 19000000
1.7.0_25 test took 486.429781ms, result is 20000000

MethodHandle:
1.7.0_25 test took 25.461098ms, result is 21000000
1.7.0_25 test took 20.715413ms, result is 22000000
1.7.0_25 test took 21.030841ms, result is 23000000
1.7.0_25 test took 21.90111ms, result is 24000000
1.7.0_25 test took 20.629516ms, result is 25000000
1.7.0_25 test took 20.640341ms, result is 26000000
1.7.0_25 test took 20.661581ms, result is 27000000
1.7.0_25 test took 20.637415ms, result is 28000000
1.7.0_25 test took 20.975565ms, result is 29000000
1.7.0_25 test took 21.694985ms, result is 30000000
1.7.0_25 test took 20.975816ms, result is 31000000
1.7.0_25 test took 20.976097ms, result is 32000000
1.7.0_25 test took 20.676224ms, result is 33000000
1.7.0_25 test took 21.172267ms, result is 34000000
1.7.0_25 test took 21.121363ms, result is 35000000
1.7.0_25 test took 20.634983ms, result is 36000000
1.7.0_25 test took 20.732907ms, result is 37000000
1.7.0_25 test took 22.009612ms, result is 38000000
1.7.0_25 test took 21.202507ms, result is 39000000
1.7.0_25 test took 20.722242ms, result is 40000000

1.7.0_25 -server
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Reflection:
1.7.0_25 test took 337.936316ms, result is 1000000
1.7.0_25 test took 314.147279ms, result is 2000000
1.7.0_25 test took 313.477929ms, result is 3000000
1.7.0_25 test took 320.835269ms, result is 4000000
1.7.0_25 test took 319.10705ms, result is 5000000
1.7.0_25 test took 320.349948ms, result is 6000000
1.7.0_25 test took 318.29908ms, result is 7000000
1.7.0_25 test took 318.488458ms, result is 8000000
1.7.0_25 test took 319.796857ms, result is 9000000
1.7.0_25 test took 318.570447ms, result is 10000000
1.7.0_25 test took 323.644359ms, result is 11000000
1.7.0_25 test took 319.531017ms, result is 12000000
1.7.0_25 test took 316.188218ms, result is 13000000
1.7.0_25 test took 316.87818ms, result is 14000000
1.7.0_25 test took 318.551867ms, result is 15000000
1.7.0_25 test took 321.109684ms, result is 16000000
1.7.0_25 test took 318.603074ms, result is 17000000
1.7.0_25 test took 318.328741ms, result is 18000000
1.7.0_25 test took 318.96289ms, result is 19000000
1.7.0_25 test took 318.453513ms, result is 20000000

MethodHandle:
1.7.0_25 test took 26.134153ms, result is 21000000
1.7.0_25 test took 19.892563ms, result is 22000000
1.7.0_25 test took 19.786943ms, result is 23000000
1.7.0_25 test took 19.886252ms, result is 24000000
1.7.0_25 test took 19.745175ms, result is 25000000
1.7.0_25 test took 19.856986ms, result is 26000000
1.7.0_25 test took 19.618864ms, result is 27000000
1.7.0_25 test took 19.553518ms, result is 28000000
1.7.0_25 test took 19.617232ms, result is 29000000
1.7.0_25 test took 19.839863ms, result is 30000000
1.7.0_25 test took 19.85349ms, result is 31000000
1.7.0_25 test took 19.869141ms, result is 32000000
1.7.0_25 test took 19.788379ms, result is 33000000
1.7.0_25 test took 19.834533ms, result is 34000000
1.7.0_25 test took 19.774827ms, result is 35000000
1.7.0_25 test took 19.890508ms, result is 36000000
1.7.0_25 test took 19.728689ms, result is 37000000
1.7.0_25 test took 20.813264ms, result is 38000000
1.7.0_25 test took 19.925914ms, result is 39000000
1.7.0_25 test took 19.747799ms, result is 40000000


1.7.0_51
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Reflection:
1.7.0_51 test took 466.50922ms, result is 1000000
1.7.0_51 test took 461.765196ms, result is 2000000
1.7.0_51 test took 455.94125ms, result is 3000000
1.7.0_51 test took 466.278862ms, result is 4000000
1.7.0_51 test took 462.162703ms, result is 5000000
1.7.0_51 test took 458.702197ms, result is 6000000
1.7.0_51 test took 458.655522ms, result is 7000000
1.7.0_51 test took 456.798437ms, result is 8000000
1.7.0_51 test took 461.442861ms, result is 9000000
1.7.0_51 test took 455.744569ms, result is 10000000
1.7.0_51 test took 459.281662ms, result is 11000000
1.7.0_51 test took 458.699634ms, result is 12000000
1.7.0_51 test took 459.747786ms, result is 13000000
1.7.0_51 test took 457.957492ms, result is 14000000
1.7.0_51 test took 458.307636ms, result is 15000000
1.7.0_51 test took 460.049842ms, result is 16000000
1.7.0_51 test took 457.160758ms, result is 17000000
1.7.0_51 test took 458.031872ms, result is 18000000
1.7.0_51 test took 460.400404ms, result is 19000000
1.7.0_51 test took 459.240091ms, result is 20000000

MethodHandle:
1.7.0_51 test took 954.340525ms, result is 21000000
1.7.0_51 test took 897.203592ms, result is 22000000
1.7.0_51 test took 894.487553ms, result is 23000000
1.7.0_51 test took 895.659686ms, result is 24000000
1.7.0_51 test took 895.011447ms, result is 25000000
1.7.0_51 test took 893.725899ms, result is 26000000
1.7.0_51 test took 903.277154ms, result is 27000000
1.7.0_51 test took 899.973185ms, result is 28000000
1.7.0_51 test took 898.220042ms, result is 29000000
1.7.0_51 test took 895.837941ms, result is 30000000
1.7.0_51 test took 894.758312ms, result is 31000000
1.7.0_51 test took 896.833131ms, result is 32000000
1.7.0_51 test took 898.702384ms, result is 33000000
1.7.0_51 test took 895.824354ms, result is 34000000
1.7.0_51 test took 894.310978ms, result is 35000000
1.7.0_51 test took 899.032528ms, result is 36000000
1.7.0_51 test took 899.790566ms, result is 37000000
1.7.0_51 test took 899.644684ms, result is 38000000
1.7.0_51 test took 905.272538ms, result is 39000000
1.7.0_51 test took 895.13552ms, result is 40000000

1.7.0_51 -server
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Reflection:
1.7.0_51 test took 356.550629ms, result is 1000000
1.7.0_51 test took 327.836967ms, result is 2000000
1.7.0_51 test took 328.150481ms, result is 3000000
1.7.0_51 test took 328.353236ms, result is 4000000
1.7.0_51 test took 320.563051ms, result is 5000000
1.7.0_51 test took 321.553406ms, result is 6000000
1.7.0_51 test took 323.145601ms, result is 7000000
1.7.0_51 test took 319.489219ms, result is 8000000
1.7.0_51 test took 330.00265ms, result is 9000000
1.7.0_51 test took 317.782637ms, result is 10000000
1.7.0_51 test took 315.102488ms, result is 11000000
1.7.0_51 test took 325.284197ms, result is 12000000
1.7.0_51 test took 320.079887ms, result is 13000000
1.7.0_51 test took 314.990021ms, result is 14000000
1.7.0_51 test took 315.932217ms, result is 15000000
1.7.0_51 test took 318.028109ms, result is 16000000
1.7.0_51 test took 314.670966ms, result is 17000000
1.7.0_51 test took 316.873853ms, result is 18000000
1.7.0_51 test took 314.56066ms, result is 19000000
1.7.0_51 test took 315.993021ms, result is 20000000

MethodHandle:
1.7.0_51 test took 459.604288ms, result is 21000000
1.7.0_51 test took 220.676699ms, result is 22000000
1.7.0_51 test took 185.35762ms, result is 23000000
1.7.0_51 test took 210.309632ms, result is 24000000
1.7.0_51 test took 184.110193ms, result is 25000000
1.7.0_51 test took 185.165489ms, result is 26000000
1.7.0_51 test took 184.121635ms, result is 27000000
1.7.0_51 test took 184.568204ms, result is 28000000
1.7.0_51 test took 185.385546ms, result is 29000000
1.7.0_51 test took 184.374912ms, result is 30000000
1.7.0_51 test took 185.289681ms, result is 31000000
1.7.0_51 test took 185.206616ms, result is 32000000
1.7.0_51 test took 184.138349ms, result is 33000000
1.7.0_51 test took 185.020762ms, result is 34000000
1.7.0_51 test took 185.082549ms, result is 35000000
1.7.0_51 test took 184.508512ms, result is 36000000
1.7.0_51 test took 185.615839ms, result is 37000000
1.7.0_51 test took 185.749746ms, result is 38000000
1.7.0_51 test took 184.659403ms, result is 39000000
1.7.0_51 test took 186.059765ms, result is 40000000



Последняя java 8, которую могу поставить на WinXP
1.8.0-ea 14_nov_2013
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Reflection:
1.8.0-ea test took 408.564314ms, result is 1000000
1.8.0-ea test took 402.391057ms, result is 2000000
1.8.0-ea test took 392.553457ms, result is 3000000
1.8.0-ea test took 400.462862ms, result is 4000000
1.8.0-ea test took 399.589088ms, result is 5000000
1.8.0-ea test took 395.830959ms, result is 6000000
1.8.0-ea test took 399.739331ms, result is 7000000
1.8.0-ea test took 397.875472ms, result is 8000000
1.8.0-ea test took 401.290168ms, result is 9000000
1.8.0-ea test took 397.223161ms, result is 10000000
1.8.0-ea test took 397.55742ms, result is 11000000
1.8.0-ea test took 399.476565ms, result is 12000000
1.8.0-ea test took 399.030497ms, result is 13000000
1.8.0-ea test took 397.621612ms, result is 14000000
1.8.0-ea test took 396.634137ms, result is 15000000
1.8.0-ea test took 397.65429ms, result is 16000000
1.8.0-ea test took 398.134519ms, result is 17000000
1.8.0-ea test took 398.744942ms, result is 18000000
1.8.0-ea test took 398.414317ms, result is 19000000
1.8.0-ea test took 414.532471ms, result is 20000000

MethodHandle:
1.8.0-ea test took 20.376919ms, result is 21000000
1.8.0-ea test took 17.359005ms, result is 22000000
1.8.0-ea test took 13.532396ms, result is 23000000
1.8.0-ea test took 14.21082ms, result is 24000000
1.8.0-ea test took 14.118074ms, result is 25000000
1.8.0-ea test took 13.869992ms, result is 26000000
1.8.0-ea test took 14.335324ms, result is 27000000
1.8.0-ea test took 14.670961ms, result is 28000000
1.8.0-ea test took 13.874766ms, result is 29000000
1.8.0-ea test took 13.52586ms, result is 30000000
1.8.0-ea test took 14.228545ms, result is 31000000
1.8.0-ea test took 13.864925ms, result is 32000000
1.8.0-ea test took 13.957663ms, result is 33000000
1.8.0-ea test took 14.238958ms, result is 34000000
1.8.0-ea test took 14.051881ms, result is 35000000
1.8.0-ea test took 14.228412ms, result is 36000000
1.8.0-ea test took 13.938722ms, result is 37000000
1.8.0-ea test took 14.69455ms, result is 38000000
1.8.0-ea test took 14.17208ms, result is 39000000
1.8.0-ea test took 13.939786ms, result is 40000000

1.8.0-ea 14_nov_2013 -server
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Reflection:
1.8.0-ea test took 67.185891ms, result is 1000000
1.8.0-ea test took 14.43662ms, result is 2000000
1.8.0-ea test took 5.705218ms, result is 3000000
1.8.0-ea test took 5.693741ms, result is 4000000
1.8.0-ea test took 5.719032ms, result is 5000000
1.8.0-ea test took 5.693434ms, result is 6000000
1.8.0-ea test took 5.693412ms, result is 7000000
1.8.0-ea test took 5.70156ms, result is 8000000
1.8.0-ea test took 5.693504ms, result is 9000000
1.8.0-ea test took 5.710057ms, result is 10000000
1.8.0-ea test took 5.693662ms, result is 11000000
1.8.0-ea test took 5.693355ms, result is 12000000
1.8.0-ea test took 5.704303ms, result is 13000000
1.8.0-ea test took 5.693413ms, result is 14000000
1.8.0-ea test took 6.055891ms, result is 15000000
1.8.0-ea test took 6.050324ms, result is 16000000
1.8.0-ea test took 5.693394ms, result is 17000000
1.8.0-ea test took 5.693733ms, result is 18000000
1.8.0-ea test took 5.69319ms, result is 19000000
1.8.0-ea test took 5.693427ms, result is 20000000

MethodHandle:
1.8.0-ea test took 22.234098ms, result is 21000000
1.8.0-ea test took 12.591195ms, result is 22000000
1.8.0-ea test took 11.489278ms, result is 23000000
1.8.0-ea test took 11.814367ms, result is 24000000
1.8.0-ea test took 11.605193ms, result is 25000000
1.8.0-ea test took 11.454356ms, result is 26000000
1.8.0-ea test took 11.480006ms, result is 27000000
1.8.0-ea test took 11.559448ms, result is 28000000
1.8.0-ea test took 11.67313ms, result is 29000000
1.8.0-ea test took 11.59652ms, result is 30000000
1.8.0-ea test took 11.485162ms, result is 31000000
1.8.0-ea test took 11.609507ms, result is 32000000
1.8.0-ea test took 11.488193ms, result is 33000000
1.8.0-ea test took 11.562172ms, result is 34000000
1.8.0-ea test took 21.017594ms, result is 35000000
1.8.0-ea test took 11.891896ms, result is 36000000
1.8.0-ea test took 11.456407ms, result is 37000000
1.8.0-ea test took 11.512811ms, result is 38000000
1.8.0-ea test took 11.446618ms, result is 39000000
1.8.0-ea test took 13.657352ms, result is 40000000





TestMethodHandle.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
package testmethodhandle;

import java.lang.reflect.Method;
import java.lang.invoke.MethodHandle;
import static java.lang.invoke.MethodHandles.lookup;
import static java.lang.invoke.MethodType.methodType;
import static java.lang.System.*;

public class TestMethodHandle {

    static class Incrementer {
        public long incrementedNumber;
        public void increment() {
            incrementedNumber++;
        }
    }
    static Incrementer incrementer = new Incrementer();

    public static void main(String[] args) throws Throwable {
        out.println("Reflection:");
        for (int i = 0; i < 20; i++) {
            testReflection();
        }
        out.println();
        out.println("MethodHandle:");
        for (int i = 0; i < 20; i++) {
            testMethodHandle();
        }
    }

    private static void testMethodHandle() throws Throwable {
        MethodHandle m = lookup().findVirtual(Incrementer.class, "increment", methodType(void.class));
        long start = nanoTime();
        for (int i = 0; i < 1_000_000; i++) {
            m.invoke(incrementer);
        }
        printInfo(nanoTime() - start);
    }

    private static void testReflection() throws Exception {
        Method m = Incrementer.class.getMethod("increment");
        long start = nanoTime();
        for (int i = 0; i < 1_000_000; i++) {
            m.invoke(incrementer);
        }
        printInfo(nanoTime() - start);
    }

    private static void printInfo(long nanoTime) {
        out.print(getProperty("java.version"));
        out.print(" test took ");
        out.print(nanoTime / 1e6);
        out.print("ms, result is ");
        out.println(incrementer.incrementedNumber);
    }
}

...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Производительность рефлексии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]