优化Java中的多态代码
作者:网络转载 发布时间:[ 2015/1/6 11:13:44 ] 推荐标签:Java 多态代码
那么,强制使用内联函数调用会怎样?
一个可行的解决方法是手动实现内联函数。你可以使用 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优化可能依然达不到你期待的性能要求。

sales@spasvo.com