Java调用类型性能

标签 java performance

我整理了一个微基准测试,它似乎表明以下类型的调用在预热后的多次迭代中花费的时间大致相同。

static.method(arg);
static.finalAnonInnerClassInstance.apply(arg);
static.modifiedNonFinalAnonInnerClassInstance.apply(arg);

有没有人找到证据表明这些不同类型的调用在聚合中将具有不同的性能特征?我的发现是他们没有,但我发现这有点令人惊讶(尤其是知道字节码至少对于静态调用来说是完全不同的)所以我想看看其他人是否有任何证据。

如果它们确实具有完全相同的性能,那么这意味着在修改后的非 final 情况下具有该级别的间接性不会受到惩罚。

我知道标准的优化建议是:“编写你的代码和配置文件”,但我正在编写框架代码生成之类的东西,所以没有具体的代码可以配置文件,静态和非最终之间的选择相当重要为了灵 active 和可能的​​性能。我在微基准测试中使用框架代码,这就是我为什么不能在此处包含它的原因。

我的测试是在 Windows JDK 1.7.0_06 上运行的。

最佳答案

如果你在一个紧密的循环中对其进行基准测试,JVM 会缓存该实例,因此没有明显的区别。

如果代码在真实的应用程序中执行,

  1. 如果希望连续快速执行,例如String.length()用于 for(int i=0; i<str.length(); i++){ short_code; } , JVM 会优化它,不用担心。

  2. 如果执行的足够频繁,那么实例很可能在CPU的一级缓存中,实例的额外加载速度非常快;不用担心。

  3. 否则,会有不小的开销;但它很少执行,因此几乎不可能在应用程序的总成本中检测到开销。不用担心。

关于Java调用类型性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504431/

相关文章:

java - 我应该如何命名这个方法?

java - 如何通过在 java 中使用 Runtime.exec() 运行 sqlplus 来捕获 sqlplus 窗口的输出

java - 为什么间接增量比直接增量快?

performance - Visual Studio 2012 启动时非常慢

java - 如何为数字设计正则表达式模式?

java - 保存对象的数组列表,以便在应用程序重新启动时恢复它们。

c# - 通过网络将压缩数据从 C# 发送到 Java

c++ - Arpack++ 稀疏特征求解器比等效的 Matlab eigs() 慢很多倍

java - 限制CPU使用的线程数

python - 检查字典中的成员资格与 python 中的集合