【发布时间】:2013-05-12 20:59:18
【问题描述】:
我使用以下 Groovy 代码的 sn-p 得到了一些意想不到的基准测试结果:
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()
}
我不得不说我使用了编译的类文件并使用反射 API 调用它。长话短说(不要问;)。对于第一印象,我使用了 10 轮 + 5 次热身和 10000 次循环。 (junit-benchmark 框架) 我的 JDK 是 Verison 1.7.0_09,我使用的是 Groovy 2.1。 我在有和没有调用动态支持的情况下编译了代码 2 次。 关键是,带有 invokedynamic 的基准测试比正常编译的基准花费的时间要长得多。 我还使用斐波那契数进行了其他基准测试,结果与预期的一样(indy 花了大约一半的时间)。
有人知道这里出了什么问题吗?
谢谢。
【问题讨论】:
-
Groovy(分别是 java 编译器)是否可以内联添加内容?
标签: groovy microbenchmark invokedynamic