是否有估计说明 JSR-292 会对 Groovy 性能产生多大影响?
4 回答
invokedynamic 确实是一个复杂的故事,因为 JDK7 中的性能特征一直在变化。在将 Groovy 移植到 indy 期间,我非常非常接近 Java,大约是 1.5 倍。但我必须使用 catchExceptionGuard,它会将性能降低到 3-4 倍。我们仍然需要研究避免使用该守卫的方法。也许我们将不得不为此破坏 Groovy 2.2 中的一些现有代码。无论如何,我不需要上面提到的 invokeMethod 回退的守卫。它适用于可能包含其他异常的 GroovyRuntimeExceptions,我必须对其进行解包或做其他事情。因此,理论上可能的性能似乎介于 Java 和现有方法的 Java 速度的一半之间。调用 invokeMethod 的性能是完全不同的故事。
如果您需要更多,请在 Groovy 2.0 中使用 @CompileStatic。
我认为还没有基准,在有人执行之前,我们只能猜测......
你可能会发现这篇文章很有趣。
一般来说,它会快 10-50 倍左右。
http://www.mail-archive.com/mlvm-dev@openjdk.java.net/msg00819.html
我不确定它在多大程度上适用于 Groovy。如果我没记错的话,Groovy 有一些备用方法(例如 invokeMethod 方法)。我认为,不可能简单地使用带有 invokedynamic 的回退。
但是,有一些方法:
- 捕获未找到方法时引发的异常。不幸的是,可能有必要分析堆栈跟踪,因为您无法确定它是从哪里抛出的。调用不存在的方法时,这可能会显着减慢速度,无论它是由 invokeMethod 回调处理的。
- 看看 Groovy++。如果您满足某些限制,它允许您使用静态类型。在这种情况下,可以允许您切换到不允许这些回退的“严格动态模式”。