У меня были неожиданные результаты тестов со следующим фрагментом кода 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 занял примерно половину времени).
Кто-нибудь знает, что здесь происходит не так?
Спасибо.