那么,强制使用内联函数调用会怎样?
  一个可行的解决方法是手动实现内联函数。你可以使用 instanceof 关键字来提供优化实现,否则你只会得到一个普通(更慢)的实现。例如,如果你使用下面的代码,NavieArray会变得和标准数组一样快:

 

public int compute() {
if(array instanceof NaiveArray) {
int[] back = ((NaiveArray) array).array;
for(int k = 0; k < back.length; ++k)
back[k] = k;
int sum = 0;
for(int k = 0; k < back.length; ++k)
sum += back[k];
return sum;
}
//...
}

   当然,我也会介绍一个维护问题作为需要实现不止一次的同类算法…… 当出现性能问题时,这是一个可接受的替代。
  和往常一样,我的benchmarking代码可以在网上获取到。
  总结
  一些Java版本可能不完全支持频繁的内联函数调用,即使它可以并且应该支持。这会造成严重的性能问题。
  把类声明为 final 看起来不会缓解性能问题。
  对于消耗大的函数,可行的解决方法是自己手动优化多态和实现内联函数调用。使用 instanceof 关键字,你可以为一些特定的类编写代码并且(因此)保留多态的灵活性。
  更新
  Erich Schubert使用 double 数组运行简单的benchmark类发现他的运行结果与我的结果相矛盾,而且我们的变量实现都是一样的。我通过更新到新版本的OpenJDK证明了他的结果。下面的表格给出了处理10百万整数需要的纳秒时间:

  正如我们看到的,新版本的OpenJDK十分智能,并且消除了多态的性能开销(1.8.0_40)。如果你足够幸运地在使用这个JDK,你不需要担心这 篇文章所说的性能问题。但是,这个总体思想依然值得应用在更复杂的场景里。例如,JDK优化可能依然达不到你期待的性能要求。