我整理了一个微基准测试,它似乎表明以下类型的调用在预热后的多次迭代中花费的时间大致相同。
static.method(arg);
static.finalAnonInnerClassInstance.apply(arg);
static.modifiedNonFinalAnonInnerClassInstance.apply(arg);
有没有人找到证据表明这些不同类型的调用在聚合中将具有不同的性能特征?我的发现是他们没有,但我发现这有点令人惊讶(尤其是知道字节码至少对于静态调用来说是完全不同的)所以我想看看其他人是否有任何证据。
如果它们确实具有完全相同的性能,那么这意味着在修改后的非 final 情况下具有该级别的间接性不会受到惩罚。
我知道标准的优化建议是:“编写你的代码和配置文件”,但我正在编写框架代码生成之类的东西,所以没有具体的代码可以配置文件,静态和非最终之间的选择相当重要为了灵 active 和可能的性能。我在微基准测试中使用框架代码,这就是我为什么不能在此处包含它的原因。
我的测试是在 Windows JDK 1.7.0_06 上运行的。
最佳答案
如果你在一个紧密的循环中对其进行基准测试,JVM 会缓存该实例,因此没有明显的区别。
如果代码在真实的应用程序中执行,
如果希望连续快速执行,例如
String.length()
用于for(int i=0; i<str.length(); i++){ short_code; }
, JVM 会优化它,不用担心。如果执行的足够频繁,那么实例很可能在CPU的一级缓存中,实例的额外加载速度非常快;不用担心。
否则,会有不小的开销;但它很少执行,因此几乎不可能在应用程序的总成本中检测到开销。不用担心。
关于Java调用类型性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504431/