2013-05-12 4 views
2

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

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 framework) My JDK - Verison 1.7.0_09, и я использовал Groovy 2.1. Я скомпилировал код 2 раза с и без invokedynamic поддержки. Дело в том, что эталон с invokedynamic занял гораздо больше времени, чем обычный скомпилированный. Я также сделал другие тесты с цифрами фибоначчи, которые вели себя как ожидалось (инди заняло около половины времени).

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

Спасибо.

+0

Возможно ли, что Groovy, уважительно java-компилятор, может встроить дополнения? – Thorben

ответ

1

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

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

+0

Я пробовал Groovycode от http://blog.dhananjaynene.com/2008/07/performance-comparison-c-java-python-ruby-jython-jruby-groovy/. Эффект invokedynamic Performance был лучше. В этом тесте объекты более сложны. Если кто-то может подтвердить ваш тезис с помощью «божественного модуля», я помечаю вопрос как решенный. – Thorben