0

我将 Havlak 基准测试的 Java 代码从 Robert Hundt(参见链接)移植到 Groovy。现在我使用 Groovy 2.1.1 运行基准测试,使用动态调用和不调用动态调用,但计算所需的持续时间几乎相同。我做了什么来启用动态调用?我将groovy--indy.jars 从 groovy-2.1.1\indy 复制到 groovy-2.1.1\lib。然后我在 groovy-2.1.1\lib 中删除了所有名称中没有“indy”的 groovy .jar。此后,在 IntelliJ IDEA 中,我启用和禁用了标志 File > Settings > Compiler > Groovy Compiler > Invoke dynamic support。

我只是告诉这个让人们看看我是否正确打开了 indy 支持。但这不是我的问题。我的问题是,由于调用动态,我们可以期望在哪种情况下加快计算时间。我阅读了有关它的文章,但是很难将那里解释的关于 invoke dynamic 所做的事情翻译成“这种代码在 indy 支持下将执行得更快”的声明。Havlak 基准测试做了很多循环,其中通过调用 setter 来更改值。

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

谢谢,奥利弗

4

2 回答 2

1

我认为 invokedynamic 的主要加速将是当您使用某种鸭子类型时。

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

然而,我分析了 Groovy 中的 indy 调度功能,似乎它只是将旧的动态调度函数打包到它的方法句柄中。事实上,如果它真的这样做,它不可能更快。在我看来,invokedynamic 的 Groovy 实现目前还没有优化。

于 2013-02-25T15:31:21.297 回答
0

简短的回答:使用一个类别。如果您的代码在使用时确实变慢了,那么您没有使用 indy。

更长的答案:如果您可以在某处发布代码,我可以对其进行分析

于 2013-03-07T09:39:15.570 回答