Groovy вызываетдинамическую производительность

У меня были неожиданные результаты тестов со следующим фрагментом кода Groovy:

class A{
    def n(){
        return 1
    }
}
class B{
    def n(){
        return 2
    }
}
class C{
    def n(){
        return 3
    }
}
class D{
    def n(){
        return 4
    }
}

def bench(loops){
    def a = new A()
    def b = new B()
    def c = new C()
    def d = new D()
    def ret=0
    for(i=0; i<loops; i++){
        ret = ret + getN(a) + getN(b) + getN(c) + getN(d)
    }
    return ret
}

def getN(clazz){
    return clazz.n()
}

Я должен сказать, что использовал скомпилированные файлы классов и вызывал их с помощью Reflection API. Долго рассказывать (не спрашивайте ;). Для первых впечатлений я использовал 10 раундов + 5 разминок по 10000 петель. (фреймворк junit-benchmark) Мой JDK — Verison 1.7.0_09, и я использовал Groovy 2.1. Я скомпилировал код 2 раза с поддержкой invokedynamic и без нее. Дело в том, что бенчмарк с invokedynamic занял гораздо больше времени, чем обычный скомпилированный. Я также провел другие тесты с числами Фибоначчи, которые вели себя так, как и ожидалось (indy занял примерно половину времени).

Кто-нибудь знает, что здесь происходит не так?

Спасибо.


person Thorben    schedule 12.05.2013    source источник
comment
Возможно ли, что Groovy, соответственно компилятор Java, может встроить дополнения?   -  person Thorben    schedule 26.05.2013


Ответы (1)


Я не эксперт в Groovy, но у меня сложилось впечатление, что я где-то читал, что Groovy создает что-то вроде "класса бога". Этот класс содержит все методы, которые появляются в исходном коде Groovy, а подклассы переопределяют только определенные методы. Создание такого класса позволяет выполнять обычные вызовы invokevirtual, а не динамические поиски. Это может быть объяснением замедления.

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

person user1903659    schedule 04.06.2013
comment
Я попробовал Groovycode из blog.dhananjaynene.com/2008/07/. Производительность invokedynamic была лучше с этим. В этом бенчмарке объекты более сложные. Если кто-то может подтвердить ваш тезис с помощью «модуля бога», я отмечаю вопрос как решенный. - person Thorben; 28.06.2013