Как стать автором
Обновить

Комментарии 21

немного «более convinient» метод — это использование Expression Language (то, что используется на jsp).
Вот реализация: juel.sourceforge.net/
Согласен на счет ASM. Что бы на нем генерить классы или хотя бы их трансформировать реально приходится кодить в инструкциях байткода. Получается сначала пишешь на обычном текстовом java класс в том виде в котором хочешь, потом декомпилируешь с помощью специальной тулзы в код на ASM и вставляешь это уже в код который в рантайме генерит/модифицирует классы.
Я бы попытался использовать для этой задачи Groovy.
Groovy зело нетороплив.
И хочется строгой типизации.
Ну мне для большинства задач хватает скорости Groovy, а на счет типизации, то никто не мешает писать на Groovy в строго типизированном виде.
ЗЫ: автор, если не сложно, то добавь в замеры производительности вариант с использованием Groovy.
видимо напрашивается вторая часть — script-way vs bytecode-way.
Раз уж в этом треде обсуждали groovy — может состряпаете пример? Ибо я не в зуб ногой.
Groovy компилируется в байт код, так что это тоже bytecode-way :)
Хорошо, с меня пример, только по позже.
попробуйте nailgun
Вы, фактически, компилируете байткод из исходника. Если устраивает, что класс генерится время порядка секунды — то можно и так, конечно. Но если скорость _настолько_ неважна, то гораздо проще использовать встроенный JS-интерпретатор.
А можно пример?
Пример чего, работы с JS?

java.sun.com/javase/6/docs/technotes/guides/scripting/index.html

И гугл по словам “Java scripting API”.
Если интересно, я добавил третьим методом вычисление с помощью js. ужас — мягко сказано. в тесте я складываю результат выполнения функции в цикле. на тестах из статьи — приблизительно 350 мс на 100 миллионов вызовов. Для того чтобы дождаться выполнение теста с js — пришлось уменьшить число прогонов в 1000 раз.

Вышло 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'инга). Но дальше видно, что разницы принципиальной нет.

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 я тоже щупал… Но возможно, я что-то делал и не так, раз у Вас совершенно другие цифры получаются…
НЛО прилетело и опубликовало эту надпись здесь
На каждое выражение создавать новый класс? Не слишком ли ресурсоемко?
Зависит от задачи, если требуется несколько раз создать и много больше раз выполнить — тогда всё окей. Если много раз создать и по одному разу вычислить — не очень.
А не распухает ли при этом PermGen — вы проверяли?
Конечно распухает, класс-то нужно хранить.
Если это проблема — нужно использовать отдельный ClassLoader и «потерять» его, когда эти классы/выражения станут не нужны.
Это понятно. По мне так сомнительный это подход чтобы выполнять выражения.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории