在什么情况下我们可以期望Groovy2.0 +的性能提升会调用动态?

时间:2013-02-24 21:27:44

标签: groovy invokedynamic

我将Havlak基准的Java代码从Robert Hundt(见link)移植到Groovy。现在我使用Groovy 2.1.1运行基准测试,调用动态而没有,但计算所用的持续时间几乎相同。我做了什么来启用调用动态?我将groovy- -indy.jars从groovy-2.1.1 \ indy复制到了groovy-2.1.1 \ lib。然后我在groovy-2.1.1 \ lib中删除了名字中所有groovy .jars的“indy”。此后,在IntelliJ IDEA中,我启用并禁用了标志文件>设置>编译器> Groovy编译器>调用动态支持。

我只是告诉这个让人们看看我是否正确地打开了indy支持。但这不是我的问题。我的问题是,由于调用动态,我们可以期望在什么样的情况下加快计算时间。我阅读了有关它的文章,但很难将有关调用动态的内容的内容翻译成一些声明“这种代码将在indy支持下更快地执行”。 Havlak基准测试执行了大量循环,其中值通过调用setter进行更改。

如果对此事有所了解的人会在这里放下一些解释,我会很高兴: - )。

谢谢,奥利弗

2 个答案:

答案 0 :(得分:1)

我认为invokedynamic的主要加速是当你使用某种鸭子打字时。

invokedynamic API适用于JVM上具有动态方法分派的语言。 Groovy肯定是其中之一。但是如果你使用动态调度的方法,它只能使用indy。如果你需要,我可以给你一个例子。

但是我已经分析了Groovy中的indy dispatch功能,看起来它只将旧的动态调度函数打包到其方法句柄中。事实上,如果确实如此,它就不会更快。 在我看来,目前还没有优化invokedynamic的Groovy实现。

答案 1 :(得分:0)

简短回答: 使用类别。如果您的代码在使用时变得慢得多,那么您就不会使用indy。

更长的回答: 如果你可以在某个地方发布代码我可以分析它