Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Invokedynamic perfomance. / 25 сообщений из 35, страница 1 из 2
23.03.2013, 23:01:12
    #38196141
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Прочитал про динамичность в 7ой Java. По результат некоторых измерений вызов методов с помощью MethodHandle почти не уступает по производительности прямым вызовам. Решил опробовать. На деле же оказалось что оно оказалось примерно в 7-8 раз медленней Reflection механизма. Возможно я что-то делаю не так?

Код: 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.
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.InvocationTargetException;

public class Main {
    static TestInstance test = new TestInstance();

    public static void main(String ... args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class cl = test.getClass();

        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodType mt = MethodType.methodType(void.class);

        MethodHandle handle = lookup.findVirtual(TestInstance.class, "publicMethod", mt);

        try {
            long start = System.currentTimeMillis();
            System.out.println("Start time: " + start);

            for (int i=0; i<1000000000; i++) {
                handle.invoke(test);
            }

            long stop = System.currentTimeMillis();
            System.out.println("Stop time: " + stop);

            System.out.println("Time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}



И довольно странно что IDEA не может найти класс InvokeDynamic, который так часто упоминается в разных статьях.
...
Рейтинг: 0 / 0
23.03.2013, 23:08:24
    #38196145
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
InvokeDynamic это не класс, это специальная инструкция для языков с динамической типизацией, чтобы они более эффективно работали в JVM.
...
Рейтинг: 0 / 0
23.03.2013, 23:30:57
    #38196159
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Blazkowicz,


Именно класс InvokeDynamic я взял из этой статьи.
...
Рейтинг: 0 / 0
23.03.2013, 23:46:01
    #38196179
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Если у тебя и остальные такие бенчмарки, типо
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
try {
            long start = System.currentTimeMillis();
            System.out.println("Start time: " + start);

            for (int i=0; i<1000000000; i++) {
                handle.invoke(test);
            }

            long stop = System.currentTimeMillis();
            System.out.println("Stop time: " + stop);

            System.out.println("Time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }



то подозреваю, что в случае прямого метода, а может и рефлекшена, может быть выкинута нафиг JITом, ужасный бенчмарк короче, намеряют а потом говорят что java тормозит
...
Рейтинг: 0 / 0
23.03.2013, 23:52:32
    #38196186
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
http://download.java.net/jdk7/archive/b122/docs/api/java/dyn/InvokeDynamic.html
Похоже этот класс изначально планировался в JSR, но в финальный релиз Java 7 его не включили.
...
Рейтинг: 0 / 0
24.03.2013, 00:01:12
    #38196190
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
забыл ник,


Причём здесь ваше "java тормозит"? Я не ставил перед собой цели написать какой-нибудь высококачественный и точный бенчмарк, это скорее firstlook.

Что за "прямые методы", что и куда по вашему выбрасывает JIT и причём тут JIT вообще я не понял.
...
Рейтинг: 0 / 0
24.03.2013, 00:04:37
    #38196194
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Blazkowicz,


Да, я уже нашёл информацию по этому поводу. Но суть вообще то не в классе InvokeDynamic.
...
Рейтинг: 0 / 0
24.03.2013, 00:10:08
    #38196199
rdm
rdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
DoSOfRedRiverзабыл ник,


Причём здесь ваше "java тормозит"? Я не ставил перед собой цели написать какой-нибудь высококачественный и точный бенчмарк, это скорее firstlook.

Что за "прямые методы", что и куда по вашему выбрасывает JIT и причём тут JIT вообще я не понял.
Как я понял JIT вполне может заменить рефлексию/прямые вызовы на прямые вызовы/инлайн(?), т.е. заняться оптимизацией, которую он видимо не может сделать для invoke.
...
Рейтинг: 0 / 0
24.03.2013, 00:11:46
    #38196201
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
DoSOfRedRiverДа, я уже нашёл информацию по этому поводу. Но суть вообще то не в классе InvokeDynamic.
Блин, эти классы нужны для использовать скриптовыми языками. Что мы тут вообще пытаемся померять?
...
Рейтинг: 0 / 0
24.03.2013, 03:17:51
    #38196280
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
DoSOfRedRiverзабыл ник,


Причём здесь ваше "java тормозит"? Я не ставил перед собой цели написать какой-нибудь высококачественный и точный бенчмарк, это скорее firstlook.

Что за "прямые методы", что и куда по вашему выбрасывает JIT и причём тут JIT вообще я не понял.
Под прямыми методами я подразумевал обычный колл метода на любом объекте, я думал вы их тоже меряете.
Платформа java обладает одним интересным свойством, адаптивной оптимизацией. Так как выполнение программы контролируется JVM, то она может и успешно собирает статистику вызовов и оптимизирует и компилит в машинный код самые горячие места. Также не стоит забывать о режиме исполнения -client или -server. Есть еще нюансы с GC, класслоадингом и параметрами вирутальной машины.
Я все это упоминаю лишь к тому, чтобы вы поняли, что в java микробенчмарки стоит писать лишь в тех случаях когда ты знаешь что меряешь и зачем. Firstlook зачастую весьма ошибочен и приводит к абсолютно неверным результатам. В вашем бенче еще к тому же происходит OSR(On Stack Replacement) - хитрая штука, если в цикле много итерацией, jit в конце концов компилит в машинные инструкции прямо посреди выполнения и заменяет интерпретируемый код на машинный. К тому же наверняка GC в случае рефлекшена и инвоук динамика работает по-разному, тоже может приводить к смешным результатам.
В общем если что-то хотите померять -
1) Необходимо делать warmup, то есть дать коду поработать минут 5-10, чтобы он обработался джитом и все классы гарантированно загрузились, а не посреди бенча
2) Подумать о том сколько надо выделить памяти, чтобы опять же GC не влез посередине бенча.
3) Тестируемый код всегда должен производить побочные действия вроде println, а то есть вероятность что особо хитрый джит выкинет код нафиг посчитав его ненужным и ни на что не влиящим.
4) Чем больше итераций и прогонов тем лучше, считайте по статистическим методам
Есть много еще факторов, но эти основные
...
Рейтинг: 0 / 0
24.03.2013, 13:06:00
    #38196399
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
забыл ник,

Спасибо за развёрнутый ответ. Переписал, получились совсем другие результаты. Но хотел бы удостоверится, что в этот раз я не наделал ошибок.

Код: 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.
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    static TestInstance test = new TestInstance();

    static void testInvokeDynamic() throws NoSuchMethodException, IllegalAccessException {
        int [] ar = new int[10000000];

        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodType mt = MethodType.methodType(int.class);

        MethodHandle handle = lookup.findStatic(TestInstance.class, "publicStaticMethod", mt);

        try {
            long start = System.currentTimeMillis();

            for (int i=0; i<10000000; i++) {
                ar[i] = TestInstance.publicStaticMethod();
            }

            long stop = System.currentTimeMillis();

            System.out.println("InvokeDynamic time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    static void testDirect() {
        int [] ar = new int[10000000];

        try {
            long start = System.currentTimeMillis();

            for (int i=0; i<10000000; i++) {
                ar[i] = TestInstance.publicStaticMethod();
            }

            long stop = System.currentTimeMillis();

            System.out.println("Direct call time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    static void testReflection() throws NoSuchMethodException {
        int [] ar = new int[10000000];

        Method method = test.getClass().getMethod("publicStaticMethod");

        try {
            long start = System.currentTimeMillis();

            for (int i=0; i<10000000; i++) {
                ar[i] = (int)method.invoke(test);
            }

            long stop = System.currentTimeMillis();

            System.out.println("Reflection time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    static void testReflectionAccessible() throws NoSuchMethodException {
        int [] ar = new int[10000000];

        Method method = test.getClass().getMethod("publicStaticMethod");
        method.setAccessible(true);

        try {
            long start = System.currentTimeMillis();

            for (int i=0; i<10000000; i++) {
                ar[i] = (int)method.invoke(test);
            }

            long stop = System.currentTimeMillis();

            System.out.println("Reflection accessible time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    public static void main(String ... args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Main.testDirect();
        Main.testInvokeDynamic();
        Main.testReflection();
        Main.testReflectionAccessible();

        System.out.println("\n___\n");

        Main.testDirect();
        Main.testInvokeDynamic();
        Main.testReflection();
        Main.testReflectionAccessible();
    }
}



Blazkowicz,

Почему вы думаете, что invokedynamic не может иметь практического применения в Java? Я, например, сейчас пишу приложение которое активно работает с Reflection. Дак почему бы мне не заменить её на invokedynamic?
...
Рейтинг: 0 / 0
24.03.2013, 13:54:35
    #38196417
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
DoSOfRedRiverПочему вы думаете, что invokedynamic не может иметь практического применения в Java?

А почему вы думаете что может?

DoSOfRedRiverЯ, например, сейчас пишу приложение которое активно работает с Reflection.

setAccessible(true) оптимизацию уже делали?

DoSOfRedRiverДак почему бы мне не заменить её на invokedynamic?
Но почему именно invokedynamic??? Почему не Unsafe? Почему не кодогенерация? Откуда такая уверенность что invokedynamic это какая-то "быстрая рефлексия"???
...
Рейтинг: 0 / 0
24.03.2013, 14:18:25
    #38196432
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
BlazkowiczsetAccessible(true) оптимизацию уже делали?

Да. В сообщении выше даже код приведён. Как правило оно работает лишь на 20-30% быстрей.

BlazkowiczНо почему именно invokedynamic??? Почему не Unsafe? Почему не кодогенерация? Откуда такая уверенность что invokedynamic это какая-то "быстрая рефлексия"???

Наверное, на то он и Unsafe, что его использование не желательно, верно?
Я не говорил о том, что invokedynamic это "быстрая рефлексия", я привёл его как хорошую замену рефлексии.
Ну и как по вашему должен использоваться invokedynamic? В других JVM based языках? А если я пишу некий интерпретатор, который по функционалу схож простым скриптовым языком? Почему я не могу использовать indy в Java?
Лично я не вижу адекватных причин не использовать indy. И если с рефлексией как правило всё упиралось в производительность, то тут откешированный метод исполняется даже быстрей direct call.
...
Рейтинг: 0 / 0
24.03.2013, 14:24:17
    #38196435
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Blazkowicz,

В конце концов, мне кажется именно invokedynamic будет, во всяком случае частично, использоваться в 8ой Java для реализации ссылок на методы.
...
Рейтинг: 0 / 0
24.03.2013, 14:34:38
    #38196441
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
DoSOfRedRiver,

Воооо гораздо лучше)
Пара мелких замечаний, чтобы уж наверняка код не выкинулся я бы после long stop = ...
сделал бы println(ar.toString()),
далее я бы убедился что в процессе бенча не происходит динамической компиляции и вызово GC, для этого есть опции +PrintCompilation и куча параметров для GC, точные названия не помню - достаточно писать их в файл, и после теста проверить что сборок не было.
Если вы видите что динамическая компиляция все еще присутствует или GC вызывается, то поиграться с параметрами jvm, пока не добьетесь того чего нужно. Вот после этого результатам уже можно доверять.
Кстати запускаете как -server?
Еще бы посоветовал после warmup делать System.gc() два раза, два потому что есть тонкости с финализаторами.

Ну и выложите потом результаты - самому интересно.
...
Рейтинг: 0 / 0
24.03.2013, 15:07:33
    #38196454
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
DoSOfRedRiverBlazkowicz,

В конце концов, мне кажется именно invokedynamic будет, во всяком случае частично, использоваться в 8ой Java для реализации ссылок на методы.
ОК. Убедили.
...
Рейтинг: 0 / 0
24.03.2013, 17:03:37
    #38196506
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Вот собственно код:

Код: 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.
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;oSOfRR

public class Main {
    public static final int COUNT = 100000000;
    static TestInstance test = new TestInstance();

    static void testInvokeDynamic() throws NoSuchMethodException, IllegalAccessException {
        int [] ar = new int[COUNT];

        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodType mt = MethodType.methodType(int.class);

        MethodHandle handle = lookup.findStatic(TestInstance.class, "publicStaticMethod", mt) ;

        try {
            long start = System.currentTimeMillis();

            for (int i=0; i<COUNT; i++) {
                ar[i] = TestInstance.publicStaticMethod();
            }

            long stop = System.currentTimeMillis();

            System.out.println(ar);

            System.out.println("InvokeDynamic time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    static void testDirect() {
        int [] ar = new int[COUNT];

        try {
            long start = System.currentTimeMillis();

            for (int i=0; i<COUNT; i++) {
                ar[i] = TestInstance.publicStaticMethod();
            }

            long stop = System.currentTimeMillis();

            System.out.println(ar);

            System.out.println("Direct call time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    static void testReflection() throws NoSuchMethodException {
        int [] ar = new int[COUNT];

        Method method = test.getClass().getMethod("publicStaticMethod");

        try {
            long start = System.currentTimeMillis();

            for (int i=0; i<COUNT; i++) {
                ar[i] = (int)method.invoke(test);
            }

            long stop = System.currentTimeMillis();

            System.out.println(ar);

            System.out.println("Reflection time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    static void testReflectionAccessible() throws NoSuchMethodException {
        int [] ar = new int[COUNT];

        Method method = test.getClass().getMethod("publicStaticMethod");
        method.setAccessible(true);

        try {
            long start = System.currentTimeMillis();

            for (int i=0; i<COUNT; i++) {
                ar[i] = (int)method.invoke(test);
            }

            long stop = System.currentTimeMillis();

            System.out.println(ar);

            System.out.println("Reflection accessible time: " + (stop - start));
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    public static void main(String ... args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Main.testDirect();
        Main.testInvokeDynamic();
        Main.testReflection();
        Main.testReflectionAccessible();

        System.out.println("\n___\n");

        System.gc();
        System.gc();

        Main.testDirect();
        Main.testInvokeDynamic();
        Main.testReflection();
        Main.testReflectionAccessible();
    }
}



Параметры машины:

-Xms512m -Xmx1g -XX:+UseConcMarkSweepGC -client


System.out:

[I@2d8b62e0
Direct
call time: 164
[I@37eaab
InvokeDynamic
time: 153
[I@7f38f3d1
Reflection
time: 840
[I@1e48d65
Reflection
accessible time: 637

___

[I@1e5cd7f9
Direct
call time: 158
[I@77be91c8
InvokeDynamic
time: 143
[I@545ec940
Reflection
time: 780
[I@39ee4dbe
Reflection
accessible time: 611


С PrintCompilation сам не разобрался, но вот на всякий случай System.out с ним:

137 1 java.lang.String::hashCode (55 bytes)
137 2 java.lang.String::charAt (29 bytes)
415 3 TestInstance::publicStaticMethod (12 bytes)
416 1 % ! Main::testDirect @ 11 (76 bytes)
568 1 % ! Main::testDirect @ -2 (76 bytes) made not entrant
[I@121f34d0
Direct
call time: 155
684 2 % ! Main::testInvokeDynamic @ 35 (107 bytes)
[I@512d297a
InvokeDynamic
time: 158
948 4 java.lang.Object::<init> (1 bytes)
953 5 java.lang.Number::<init> (5 bytes)
953 6 java.lang.Integer::<init> (10 bytes)
953 7 java.lang.reflect.Modifier::isPublic (12 bytes)
953 8 n sun.reflect.Reflection::getClassAccessFlags (0 bytes) (static)
953 9 sun.reflect.Reflection::quickCheckMemberAccess (10 bytes)
953 10 java.lang.reflect.Method::invoke (63 bytes)
954 11 sun.reflect.DelegatingMethodAccessorImpl::invoke (10 bytes)
957 12 java.lang.Integer::intValue (5 bytes)
957 13 ! sun.reflect.GeneratedMethodAccessor1::invoke (52 bytes)
958 3 % ! Main::testReflection @ 28 (111 bytes)
[I@1e48d65
Reflection
time: 849
1896 4 % ! Main::testReflectionAccessible @ 33 (116 bytes)
[I@1e5cd7f9
Reflection
accessible time: 679

___

2597 14 ! Main::testDirect (76 bytes)
2679 5 % ! Main::testDirect @ 11 (76 bytes)
[I@77be91c8
Direct
call time: 151
2830 15 ! Main::testInvokeDynamic (107 bytes)
[I@1aeeb406
InvokeDynamic
time: 159
3086 16 ! Main::testReflection (111 bytes)
[I@39ee4dbe
Reflection
time: 818
4001 17 ! Main::testReflectionAccessible (116 bytes)
[I@4aa594e1
Reflection
accessible time: 662




По результатам:

Direct call time: 164
InvokeDynamic time: 153
Reflection time: 840
Reflection accessible time: 637

___


Direct call time: 158
InvokeDynamic time: 143
Reflection time: 780
Reflection accessible time: 611

В разных случая во время "прогрева" invokedynamic был быстрее и медленнее прямых вызовов. Но уже будучи откешированным indy метод исполняется быстрей.
Рефлексия здесь не конкурентноспособна. Есть некий CGLIB который позволяет это дело оптимизировать, исключая JNI, или что то вроде того, но не думаю что он по производительности сравним с indy.
...
Рейтинг: 0 / 0
24.03.2013, 17:42:29
    #38196528
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
я бы все-таки гонял с -server а не -client. К тому же я думаю у вас ошибка, метод testDirect и testDynamicInvoke делают одно и тоже.
...
Рейтинг: 0 / 0
24.03.2013, 21:13:52
    #38196663
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Какая ирония. В коде действительно ошибка. Следовательно, вопрос остаётся открытым, потому как на тестах invokedynamic оказался до трёх раз медленнее не оптимизированного Reflection. Может действительно дело в JIT, который не умеет оптимизировать новую инструкцию?
...
Рейтинг: 0 / 0
24.03.2013, 21:36:40
    #38196673
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Мне всегда казалось, что InvokeDynamic это новая команда byte-кода для JVM. Т.е. мне кажется, если вы хотите какое-то сравнение сделать, вам надо сделать сравнение именно байт кода.
...
Рейтинг: 0 / 0
24.03.2013, 22:51:15
    #38196701
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
LeonidvМне всегда казалось, что InvokeDynamic это новая команда byte-кода для JVM. Т.е. мне кажется, если вы хотите какое-то сравнение сделать, вам надо сделать сравнение именно байт кода.
Тема про MethodHandler. invokedynamic тут, действительно, не при чем.
...
Рейтинг: 0 / 0
25.03.2013, 11:37:39
    #38197044
DoSOfRedRiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
Ну вообще MethodHandle позволяет задействовать инструкцию invokedynamic. Ну и меряем производительность этой инструкции, вроде как.
...
Рейтинг: 0 / 0
25.03.2013, 11:43:54
    #38197055
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
DoSOfRedRiverНу вообще MethodHandle позволяет задействовать инструкцию invokedynamic.
Ткните нас, пожалуйста, носом в документацию где об этом написано.

DoSOfRedRiverНу и меряем производительность этой инструкции, вроде как.
Не только инструкции но и кучи другой инфраструктуры вокруг.
...
Рейтинг: 0 / 0
25.03.2013, 11:44:50
    #38197058
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
BlazkowiczОК. Убедили.
Походу не "убедили", а обманули.
...
Рейтинг: 0 / 0
25.03.2013, 11:46:40
    #38197060
Valery Shiskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invokedynamic perfomance.
DoSOfRedRiver,

На сайте http://groovy.codehaus.org можно найти интересную информацию по поводу invokeDynamic
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Invokedynamic perfomance. / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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