powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Invokedynamic perfomance.
35 сообщений из 35, показаны все 2 страниц
Invokedynamic perfomance.
    #38196141
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал про динамичность в 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
Invokedynamic perfomance.
    #38196145
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InvokeDynamic это не класс, это специальная инструкция для языков с динамической типизацией, чтобы они более эффективно работали в JVM.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38196159
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,


Именно класс InvokeDynamic я взял из этой статьи.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38196179
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у тебя и остальные такие бенчмарки, типо
Код: 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
Invokedynamic perfomance.
    #38196186
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://download.java.net/jdk7/archive/b122/docs/api/java/dyn/InvokeDynamic.html
Похоже этот класс изначально планировался в JSR, но в финальный релиз Java 7 его не включили.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38196190
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,


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

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


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


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

Что за "прямые методы", что и куда по вашему выбрасывает JIT и причём тут JIT вообще я не понял.
Как я понял JIT вполне может заменить рефлексию/прямые вызовы на прямые вызовы/инлайн(?), т.е. заняться оптимизацией, которую он видимо не может сделать для invoke.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38196201
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverДа, я уже нашёл информацию по этому поводу. Но суть вообще то не в классе InvokeDynamic.
Блин, эти классы нужны для использовать скриптовыми языками. Что мы тут вообще пытаемся померять?
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38196280
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Invokedynamic perfomance.
    #38196399
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

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

Код: 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
Invokedynamic perfomance.
    #38196417
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverПочему вы думаете, что invokedynamic не может иметь практического применения в Java?

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

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

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

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

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

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

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

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

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

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

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

Код: 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
Invokedynamic perfomance.
    #38196528
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы все-таки гонял с -server а не -client. К тому же я думаю у вас ошибка, метод testDirect и testDynamicInvoke делают одно и тоже.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38196663
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая ирония. В коде действительно ошибка. Следовательно, вопрос остаётся открытым, потому как на тестах invokedynamic оказался до трёх раз медленнее не оптимизированного Reflection. Может действительно дело в JIT, который не умеет оптимизировать новую инструкцию?
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38196673
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне всегда казалось, что InvokeDynamic это новая команда byte-кода для JVM. Т.е. мне кажется, если вы хотите какое-то сравнение сделать, вам надо сделать сравнение именно байт кода.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38196701
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeonidvМне всегда казалось, что InvokeDynamic это новая команда byte-кода для JVM. Т.е. мне кажется, если вы хотите какое-то сравнение сделать, вам надо сделать сравнение именно байт кода.
Тема про MethodHandler. invokedynamic тут, действительно, не при чем.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38197044
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вообще MethodHandle позволяет задействовать инструкцию invokedynamic. Ну и меряем производительность этой инструкции, вроде как.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38197055
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverНу вообще MethodHandle позволяет задействовать инструкцию invokedynamic.
Ткните нас, пожалуйста, носом в документацию где об этом написано.

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

На сайте http://groovy.codehaus.org можно найти интересную информацию по поводу invokeDynamic
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38197065
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczDoSOfRedRiverНу вообще MethodHandle позволяет задействовать инструкцию invokedynamic.
Ткните нас, пожалуйста, носом в документацию где об этом написано.

Ну, это только предположение. ;)

авторDoSOfRedRiverНу и меряем производительность этой инструкции, вроде как.
Не только инструкции но и кучи другой инфраструктуры вокруг.

Да. Но упирается всё в эту инструкцию. Или JIT оптимизации. Так кажется по результатом тестов моих, во всяком случае.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38200891
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем оказалось, что на самом деле для поддержки MethodHandle используется другая инструкция - invokevirtual.
От invokedynamic почему то решили отказаться.
Никакой "быстрой рефлексии" из MethodHandle не выйдет, во всяком случае до выхода Java 8.
Судя по всему, инструкция invokedynamic Java в данный момент не поддерживается.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38200895
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverВообщем оказалось, что на самом деле для поддержки MethodHandle используется другая инструкция - invokevirtual. От invokedynamic почему то решили отказаться.
Никакой "быстрой рефлексии" из MethodHandle не выйдет, во всяком случае до выхода Java 8.
Не может быть!

DoSOfRedRiverСудя по всему, инструкция invokedynamic Java в данный момент не поддерживается.
Поддерживается. На уровне компилятора и байткода.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38200935
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПоддерживается. На уровне компилятора.

В каким конкретно случаях? Есть ссылка на документацию?
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38200944
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverВ каким конкретно случаях? Есть ссылка на документацию?
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38200945
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38201004
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Что-то я не вижу в доке ни единого намёка на invokedynamic.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38201047
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverЧто-то я не вижу в доке ни единого намёка на invokedynamic.
По-моему кто-то нарывается на грубость. Вот это вот что тогда:



The invokedynamic InstructionThe invokedynamic instruction simplifies and potentially improves implementations of compilers and runtime systems for dynamic languages on the JVM. The invokedynamic instruction does this by allowing the language implementer to define custom linkage behavior. This contrasts with other JVM instructions such as invokevirtual, in which linkage behavior specific to Java classes and interfaces is hard-wired by the JVM.

Each instance of an invokedynamic instruction is called a dynamic call site. A dynamic call site is originally in an unlinked state, which means that there is no method specified for the call site to invoke. As previously mentioned, a dynamic call site is linked to a method by means of a bootstrap method. A dynamic call site's bootstrap method is a method specified by the compiler for the dynamically-typed language that is called once by the JVM to link the site. The object returned from the bootstrap method permanently determines the call site's behavior.

The invokedynamic instruction contains a constant pool index (in the same format as for the other invoke instructions). This constant pool index references a CONSTANT_InvokeDynamic entry. This entry specifies the bootstrap method (a CONSTANT_MethodHandle entry), the name of the dynamically linked method, and the argument types and return type of the call to the dynamically linked method.

The following is an example of an invokedynamic instruction. In this example, the runtime system links the dynamic call site specified by this invokedynamic instruction (which is +, the addition operator) to the IntegerOps.adder method by using the bootstrap method Example.mybsm. The methods adder and mybsm are defined in the section The Challenge of Compiling Dynamically Typed Languages (line breaks have been added for clarity):

invokedynamic InvokeDynamic
REF_invokeStatic:
Example.mybsm:
"(Ljava/lang/invoke/MethodHandles/Lookup;
Ljava/lang/String;
Ljava/lang/invoke/MethodType;)
Ljava/lang/invoke/CallSite;":
+:
"(Ljava/lang/Integer;
Ljava/lang/Integer;)
Ljava/lang/Integer;";

Note: The bytecode examples in these sections use the syntax of the ASM Java bytecode manipulation and analysis framework.

Invoking a dynamically linked method with the invokedynamic instruction involves the following steps:

Defining the Bootstrap Method
Specifying Constant Pool Entries
Using the invokedynamic Instruction



invokedynamic instructionsA dynamic call site is originally in an unlinked state. In this state, there is no target method for the call site to invoke.

Before the JVM can execute a dynamic call site (an invokedynamic instruction), the call site must first be linked. Linking is accomplished by calling a bootstrap method which is given the static information content of the call site, and which must produce a method handle that gives the behavior of the call site.

Each invokedynamic instruction statically specifies its own bootstrap method as a constant pool reference. The constant pool reference also specifies the call site's name and type descriptor, just like invokevirtual and the other invoke instructions.

Linking starts with resolving the constant pool entry for the bootstrap method, and resolving a MethodType object for the type descriptor of the dynamic call site. This resolution process may trigger class loading. It may therefore throw an error if a class fails to load. This error becomes the abnormal termination of the dynamic call site execution. Linkage does not trigger class initialization.

The bootstrap method is invoked on at least three values:

a MethodHandles.Lookup, a lookup object on the caller class in which dynamic call site occurs
a String, the method name mentioned in the call site
a MethodType, the resolved type descriptor of the call
optionally, between 1 and 251 additional static arguments taken from the constant pool

Invocation is as if by MethodHandle.invoke. The returned result must be a CallSite (or a subclass). The type of the call site's target must be exactly equal to the type derived from the dynamic call site's type descriptor and passed to the bootstrap method. The call site then becomes permanently linked to the dynamic call site.

As documented in the JVM specification, all failures arising from the linkage of a dynamic call site are reported by a BootstrapMethodError, which is thrown as the abnormal termination of the dynamic call site execution. If this happens, the same error will the thrown for all subsequent attempts to execute the dynamic call site.
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38201133
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Прошу прощения, перепутал вкладку.

Я тогда вообще не понимаю зачем нужен этот java.lang.invoke. Какой от него прок?
...
Рейтинг: 0 / 0
Invokedynamic perfomance.
    #38201144
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverЯ тогда вообще не понимаю зачем нужен этот java.lang.invoke. Какой от него прок?
На сколько я понимаю, его должны использовать компиляторы таких языков как Scala и Groovy. Для программирования на Java эти классы не нужны.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Invokedynamic perfomance.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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