Java JSR-292(invokedynamic)对Groovy性能有多大影响?

Java JSR-292(invokedynamic)对Groovy性能有多大影响?,java,groovy,invokedynamic,Java,Groovy,Invokedynamic,有没有估计JSR-292会对Groovy性能产生多大影响?我认为还没有基准测试,在有人执行之前,我们只能猜测 你会发现这件事很有趣 一般来说,速度会快10-50倍左右 我不确定它对Groovy的适用程度。如果我记得清楚的话,Groovy有一些后备方法(例如invokeMethod方法)。我认为,不可能简单地使用invokedynamic的回退功能 但是,有一些方法: 捕获未找到方法时引发的异常。不幸的是,可能有必要分析stacktrace,因为您无法确定它从何处抛出。当调用一个不存在的方法时,

有没有估计JSR-292会对Groovy性能产生多大影响?

我认为还没有基准测试,在有人执行之前,我们只能猜测


你会发现这件事很有趣

一般来说,速度会快10-50倍左右


我不确定它对Groovy的适用程度。如果我记得清楚的话,Groovy有一些后备方法(例如invokeMethod方法)。我认为,不可能简单地使用invokedynamic的回退功能

但是,有一些方法:

  • 捕获未找到方法时引发的异常。不幸的是,可能有必要分析stacktrace,因为您无法确定它从何处抛出。当调用一个不存在的方法时,无论它是由invokeMethod回调处理的,这都可能是一个显著的减速
  • 看看Groovy++。如果您满足某些限制,它允许您使用静态类型。在这种情况下,可以允许您切换到不允许这些回退的“严格动态模式”

    • invokedynamic确实是一个复杂的故事,因为JDK7中的性能特征一直在变化。在将Groovy移植到indy的过程中,我非常非常接近Java,大约1.5倍。但我必须使用catchExceptionGuard,这会将性能降低到因子3-4。我们仍然需要研究避免使用这种防护装置的方法。为此,我们可能必须破坏Groovy 2.2中的一些现有代码。无论如何,我不需要如上所述的invokeMethod回退的守卫。对于可能包含其他异常的GroovyRuntimeException,我必须打开它或使用它做其他事情。因此,理论上可能的性能似乎介于Java和现有方法Java速度的一半之间。调用invokeMethod的性能则完全不同


      如果您需要更多,请在Groovy 2.0中使用@CompileStatic。

      您能用一些参考或证据来支持吗?您好,我已经添加了链接。它基于我自己在JSR-292上创建Groovy编译器的经验。基本上,这是一个估计(正如问题所要求的那样;)确实具有误导性。事实上,在启用indy的情况下,我的速度降低了5倍。看来Groovy代码要从InvokedDynamic中获得一定的性能优势还有很长的路要走。我的遗传算法在启用invokedynamic时执行速度慢了5倍,我用Java1.8.0和Groovy2.2.1测试了它!您可以自己尝试,只需克隆这个:并运行test
      com.athaydes.ml.algorithms.LinearGPTest::testnontrivalprograms
      。它通常在4秒钟内运行,但对于groovy indy和InvokedDynamic,它至少在25秒钟内运行。另一篇文章也显示indy实际上可以降低groovy代码的运行速度: