Комментарии 21
немного «более convinient» метод — это использование Expression Language (то, что используется на jsp).
Вот реализация: juel.sourceforge.net/
Вот реализация: juel.sourceforge.net/
Согласен на счет ASM. Что бы на нем генерить классы или хотя бы их трансформировать реально приходится кодить в инструкциях байткода. Получается сначала пишешь на обычном текстовом java класс в том виде в котором хочешь, потом декомпилируешь с помощью специальной тулзы в код на ASM и вставляешь это уже в код который в рантайме генерит/модифицирует классы.
Я бы попытался использовать для этой задачи Groovy.
Groovy зело нетороплив.
И хочется строгой типизации.
И хочется строгой типизации.
Ну мне для большинства задач хватает скорости Groovy, а на счет типизации, то никто не мешает писать на Groovy в строго типизированном виде.
ЗЫ: автор, если не сложно, то добавь в замеры производительности вариант с использованием Groovy.
ЗЫ: автор, если не сложно, то добавь в замеры производительности вариант с использованием Groovy.
попробуйте nailgun
Вы, фактически, компилируете байткод из исходника. Если устраивает, что класс генерится время порядка секунды — то можно и так, конечно. Но если скорость _настолько_ неважна, то гораздо проще использовать встроенный JS-интерпретатор.
А можно пример?
Пример чего, работы с JS?
java.sun.com/javase/6/docs/technotes/guides/scripting/index.html
И гугл по словам “Java scripting API”.
java.sun.com/javase/6/docs/technotes/guides/scripting/index.html
И гугл по словам “Java scripting API”.
Если интересно, я добавил третьим методом вычисление с помощью js. ужас — мягко сказано. в тесте я складываю результат выполнения функции в цикле. на тестах из статьи — приблизительно 350 мс на 100 миллионов вызовов. Для того чтобы дождаться выполнение теста с js — пришлось уменьшить число прогонов в 1000 раз.
Вышло 4с на 100 тысяч раз. Итого в 11 тысяч раз медленнее, если я правильно посчитал. Вот уж производительность должна быть действительно неважна
Вышло 4с на 100 тысяч раз. Итого в 11 тысяч раз медленнее, если я правильно посчитал. Вот уж производительность должна быть действительно неважна
Statistics: total| amount| last| last 5| last 10| avg| dev| operation 4.00| 8.00| 0.00| 0.00| 0.00| 0.50| 0.29| .. runtime calc 2.00| 8.00| 1.00| 0.00| 0.00| 0.25| 0.17| .. compile-time calc 30504.00| 8.00| 3913.00| 3698.00| 3050.00| 3813.00| 182.28| .. script calc
Вы проверьте время генерации своего кода из постинга…
В общем, если производительность важна — надо учить джавский ассемблер, ничего не поделаешь.
В общем, если производительность важна — надо учить джавский ассемблер, ничего не поделаешь.
Ничего вы не поняли, учить ничего не надо. Мораль была такая: javassist компилирует в runtime не хуже javac, и результаты доказывали это.
И чтобы расставить все точки над i — результат с замером скорости генерации. На среднее время генерации очень сильно повлиял первый запуск, когда погружались все классы. Было 108 мс у javassist и 27 мс у script engine (кстати это мало что говорит, могут отметить профессионалы microbenchmark'инга). Но дальше видно, что разницы принципиальной нет.
И чтобы расставить все точки над i — результат с замером скорости генерации. На среднее время генерации очень сильно повлиял первый запуск, когда погружались все классы. Было 108 мс у javassist и 27 мс у script engine (кстати это мало что говорит, могут отметить профессионалы microbenchmark'инга). Но дальше видно, что разницы принципиальной нет.
tatistics: total| amount| last| last 5| last 10| avg| dev| operation 111.00| 20.00| 0.00| 0.00| 0.00| 5.55| 5.53| .. runtime initialization 0.00| 20.00| 0.00| 0.00| 0.00| 0.00| 0.00| .. compile time initialization 100.00| 20.00| 4.00| 3.00| 3.00| 5.00| 1.20| .. script initialization 1883.00| 20.00| 84.00| 85.00| 90.00| 94.15| 4.58| .. runtime calc x 10000000 1682.00| 20.00| 91.00| 88.00| 88.00| 84.10| 1.91| .. compile-time calc x 10000000 9750.00| 20.00| 433.00| 416.00| 420.00| 487.50| 59.32| .. script calc x 10000
Хм. Я, конечно, могу ошибаться, но когда я примерно год назад экспериментировал с этими вещами, классы у меня генерились очень долго, сотни миллисекунд. И javassist я тоже щупал… Но возможно, я что-то делал и не так, раз у Вас совершенно другие цифры получаются…
НЛО прилетело и опубликовало эту надпись здесь
На каждое выражение создавать новый класс? Не слишком ли ресурсоемко?
Зависит от задачи, если требуется несколько раз создать и много больше раз выполнить — тогда всё окей. Если много раз создать и по одному разу вычислить — не очень.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Разбор выражений, bytecode-way