在什么情况下,Groovy2.0+;调用动态?

在什么情况下,Groovy2.0+;调用动态?,groovy,invokedynamic,Groovy,Invokedynamic,我将Havlak基准测试的Java代码从Robert Hundt(参见)移植到Groovy。现在,我使用Groovy 2.1.1运行基准测试,使用invoke dynamic和without,但计算所需的时间几乎相同。我做了什么来启用动态调用?我将groovy--indy.jars从groovy-2.1.1\indy复制到groovy-2.1.1\lib。然后,我在groovy-2.1.1\lib中删除了名称中没有“indy”的所有groovy.jar。此后,在IntelliJ IDEA中,我启

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

我说这些只是为了让人们知道我是否正确地打开了indy support。但这不是我的问题。我的问题是,在什么样的情况下,由于调用动态,我们可以期望计算时间加快。我读过一些关于它的文章,但很难将其中关于invoke dynamic所做工作的解释转换为“这种代码在indy支持下执行得更快”的语句。Havlak基准进行了大量的循环,通过调用setter来更改值

如果有人对这件事有一些了解,我会很高兴在这里给出一些解释:-)


谢谢,Oliver,我认为InvokedDynamic的主要加速功能是在使用duck类型时

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

然而,我分析了Groovy中的indy分派功能,它似乎只将旧的动态分派功能打包到methodhandles中。事实上,如果它真的这样做了,它不会更快。 在我看来,InvokedDynamic的Groovy实现目前没有得到优化。

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

详细回答:
如果您可以将代码发布到某个地方,我可以对其进行分析

Groovy总是在执行动态调度,除非采用原始优化路径,这只在运行时可能受到影响的特定条件下执行。是的,它总是执行动态调度。如果多次使用某个方法,则InvokedDynamic只能加快执行速度。好吧,这在几乎所有的程序中都是正常情况,但应该考虑到这一点。当调用启动并链接到comiled MethodHandle时,会发生加速。然后您可以重用MethodHandle,直到发生更改。如果在脚本语言等的实现中没有indy和缓存技术,则会对每个方法调用进行分派。也许这会有所帮助,因为我认为Groovy1.6Groovy已经有了一个调用站点缓存实现。它基于运行时生成的类和一些反射。因此,重用案例以前已经是可能的。