我整理了一个微基准,似乎表明以下类型的调用在预热后的多次迭代中花费的时间大致相同。
static.method(arg);
static.finalAnonInnerClassInstance.apply(arg);
static.modifiedNonFinalAnonInnerClassInstance.apply(arg);
有没有人发现证据表明这些不同类型的调用总体上会有不同的性能特征?我的发现是他们没有,但我发现有点令人惊讶(特别是知道字节码至少对于静态调用有很大不同)所以我想找出其他人是否有任何证据。
如果它们确实具有相同的确切性能,那么这意味着在修改后的非最终情况下具有该级别的间接性不会受到任何惩罚。
我知道标准的优化建议是:“编写你的代码和配置文件”,但我正在编写框架代码生成之类的东西,所以没有要配置的特定代码,静态和非最终之间的选择对于灵活性都相当重要和可能的表现。我在 microbenchmark 中使用框架代码,这就是为什么我不能在此处包含它的原因。
我的测试是在 Windows JDK 1.7.0_06 上运行的。