|
|
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
Прочитал про динамичность в 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. И довольно странно что IDEA не может найти класс InvokeDynamic, который так часто упоминается в разных статьях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 23:01:12 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
InvokeDynamic это не класс, это специальная инструкция для языков с динамической типизацией, чтобы они более эффективно работали в JVM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 23:08:24 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
Если у тебя и остальные такие бенчмарки, типо Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. то подозреваю, что в случае прямого метода, а может и рефлекшена, может быть выкинута нафиг JITом, ужасный бенчмарк короче, намеряют а потом говорят что java тормозит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 23:46:01 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
http://download.java.net/jdk7/archive/b122/docs/api/java/dyn/InvokeDynamic.html Похоже этот класс изначально планировался в JSR, но в финальный релиз Java 7 его не включили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2013, 23:52:32 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
забыл ник, Причём здесь ваше "java тормозит"? Я не ставил перед собой цели написать какой-нибудь высококачественный и точный бенчмарк, это скорее firstlook. Что за "прямые методы", что и куда по вашему выбрасывает JIT и причём тут JIT вообще я не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 00:01:12 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Да, я уже нашёл информацию по этому поводу. Но суть вообще то не в классе InvokeDynamic. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 00:04:37 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiverзабыл ник, Причём здесь ваше "java тормозит"? Я не ставил перед собой цели написать какой-нибудь высококачественный и точный бенчмарк, это скорее firstlook. Что за "прямые методы", что и куда по вашему выбрасывает JIT и причём тут JIT вообще я не понял. Как я понял JIT вполне может заменить рефлексию/прямые вызовы на прямые вызовы/инлайн(?), т.е. заняться оптимизацией, которую он видимо не может сделать для invoke. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 00:10:08 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiverДа, я уже нашёл информацию по этому поводу. Но суть вообще то не в классе InvokeDynamic. Блин, эти классы нужны для использовать скриптовыми языками. Что мы тут вообще пытаемся померять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 00:11:46 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
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) Чем больше итераций и прогонов тем лучше, считайте по статистическим методам Есть много еще факторов, но эти основные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 03:17:51 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
забыл ник, Спасибо за развёрнутый ответ. Переписал, получились совсем другие результаты. Но хотел бы удостоверится, что в этот раз я не наделал ошибок. Код: 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. Blazkowicz, Почему вы думаете, что invokedynamic не может иметь практического применения в Java? Я, например, сейчас пишу приложение которое активно работает с Reflection. Дак почему бы мне не заменить её на invokedynamic? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 13:06:00 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiverПочему вы думаете, что invokedynamic не может иметь практического применения в Java? А почему вы думаете что может? DoSOfRedRiverЯ, например, сейчас пишу приложение которое активно работает с Reflection. setAccessible(true) оптимизацию уже делали? DoSOfRedRiverДак почему бы мне не заменить её на invokedynamic? Но почему именно invokedynamic??? Почему не Unsafe? Почему не кодогенерация? Откуда такая уверенность что invokedynamic это какая-то "быстрая рефлексия"??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 13:54:35 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczsetAccessible(true) оптимизацию уже делали? Да. В сообщении выше даже код приведён. Как правило оно работает лишь на 20-30% быстрей. BlazkowiczНо почему именно invokedynamic??? Почему не Unsafe? Почему не кодогенерация? Откуда такая уверенность что invokedynamic это какая-то "быстрая рефлексия"??? Наверное, на то он и Unsafe, что его использование не желательно, верно? Я не говорил о том, что invokedynamic это "быстрая рефлексия", я привёл его как хорошую замену рефлексии. Ну и как по вашему должен использоваться invokedynamic? В других JVM based языках? А если я пишу некий интерпретатор, который по функционалу схож простым скриптовым языком? Почему я не могу использовать indy в Java? Лично я не вижу адекватных причин не использовать indy. И если с рефлексией как правило всё упиралось в производительность, то тут откешированный метод исполняется даже быстрей direct call. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 14:18:25 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, В конце концов, мне кажется именно invokedynamic будет, во всяком случае частично, использоваться в 8ой Java для реализации ссылок на методы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 14:24:17 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiver, Воооо гораздо лучше) Пара мелких замечаний, чтобы уж наверняка код не выкинулся я бы после long stop = ... сделал бы println(ar.toString()), далее я бы убедился что в процессе бенча не происходит динамической компиляции и вызово GC, для этого есть опции +PrintCompilation и куча параметров для GC, точные названия не помню - достаточно писать их в файл, и после теста проверить что сборок не было. Если вы видите что динамическая компиляция все еще присутствует или GC вызывается, то поиграться с параметрами jvm, пока не добьетесь того чего нужно. Вот после этого результатам уже можно доверять. Кстати запускаете как -server? Еще бы посоветовал после warmup делать System.gc() два раза, два потому что есть тонкости с финализаторами. Ну и выложите потом результаты - самому интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 14:34:38 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiverBlazkowicz, В конце концов, мне кажется именно invokedynamic будет, во всяком случае частично, использоваться в 8ой Java для реализации ссылок на методы. ОК. Убедили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 15:07:33 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
Вот собственно код: Код: 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. Параметры машины: -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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 17:03:37 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
я бы все-таки гонял с -server а не -client. К тому же я думаю у вас ошибка, метод testDirect и testDynamicInvoke делают одно и тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 17:42:29 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
Какая ирония. В коде действительно ошибка. Следовательно, вопрос остаётся открытым, потому как на тестах invokedynamic оказался до трёх раз медленнее не оптимизированного Reflection. Может действительно дело в JIT, который не умеет оптимизировать новую инструкцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 21:13:52 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
Мне всегда казалось, что InvokeDynamic это новая команда byte-кода для JVM. Т.е. мне кажется, если вы хотите какое-то сравнение сделать, вам надо сделать сравнение именно байт кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 21:36:40 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
LeonidvМне всегда казалось, что InvokeDynamic это новая команда byte-кода для JVM. Т.е. мне кажется, если вы хотите какое-то сравнение сделать, вам надо сделать сравнение именно байт кода. Тема про MethodHandler. invokedynamic тут, действительно, не при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 22:51:15 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
Ну вообще MethodHandle позволяет задействовать инструкцию invokedynamic. Ну и меряем производительность этой инструкции, вроде как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 11:37:39 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiverНу вообще MethodHandle позволяет задействовать инструкцию invokedynamic. Ткните нас, пожалуйста, носом в документацию где об этом написано. DoSOfRedRiverНу и меряем производительность этой инструкции, вроде как. Не только инструкции но и кучи другой инфраструктуры вокруг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 11:43:54 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczОК. Убедили. Походу не "убедили", а обманули. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 11:44:50 |
|
||
|
Invokedynamic perfomance.
|
|||
|---|---|---|---|
|
#18+
DoSOfRedRiver, На сайте http://groovy.codehaus.org можно найти интересную информацию по поводу invokeDynamic ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 11:46:40 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38196673&tid=2129682]: |
0ms |
get settings: |
10ms |
get forum list: |
28ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
59ms |
get topic data: |
18ms |
get forum data: |
4ms |
get page messages: |
91ms |
get tp. blocked users: |
2ms |
| others: | 298ms |
| total: | 524ms |

| 0 / 0 |
