5

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

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

有没有人发现证据表明这些不同类型的调用总体上会有不同的性能特征?我的发现是他们没有,但我发现有点令人惊讶(特别是知道字节码至少对于静态调用有很大不同)所以我想找出其他人是否有任何证据。

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

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

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

4

1 回答 1

1

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

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

  1. 如果期望背靠背执行非常快,例如String.length()用在 中for(int i=0; i<str.length(); i++){ short_code; },JVM 会对其进行优化,不用担心。

  2. 如果执行的足够频繁,实例很可能在 CPU 的 L1 缓存中,则实例的额外负载非常快;不用担心。

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

于 2012-11-22T01:08:35.880 回答