优化Java中的多态代码
作者:网络转载 发布时间:[ 2015/1/6 11:13:44 ] 推荐标签:Java 多态代码
Oracle的Java是一个门快速的语言,有时候它可以和C++一样快。编写Java代码时,我们通常使用接口、继承或者包装类(wrapper class)来实现多态,使软件更加灵活。不幸的是,多态会引入更多的调用,让Java的性能变得糟糕。部分问题是,Java不建议使用完全的内联代码,即使它是非常安全的。(这个问题可能会在新的Java版本里得到缓解,请看文章后面的更新部分)
考虑下这种情况,我们要用接口抽象出一个整型数组:
public interface Array {
public int get(int i);
public void set(int i, int x);
public int size();
}
你为什么要这样做?可能是因为你的数据是保存在数据库里、网络上、磁盘上或者在其他的数据结构里。你想一次编码后不用关心数组的具体实现。
编写一个与标准Java数组一样高效率的类并不难,不同之处在于它实现了这个接口:
|
public final class NaiveArray implements Array {
protected int[] array;
public NaiveArray(int cap) {
array = new int[cap];
}
public int get(int i) {
return array[i];
}
public void set(int i, int x) {
array[i] = x;
}
public int size() {
return array.length;
}
}
|
至少在理论上,NaiveArray类不会出现任何的性能问题。这个类是final的,所有的方法都很简短。
不幸的是,在一个简单的benchmark类里,当使用NavieArray作为数组实例时,你会发现NavieArray比标准数组慢5倍以上。像这个例子:
|
public int compute() {
for(int k = 0; k < array.size(); ++k)
array.set(k,k);
int sum = 0;
for(int k = 0; k < array.size(); ++k)
sum += array.get(k);
return sum;
}
|
你可以通过使用NavieArray作为NavieArray的一个实例来稍微减缓性能问题(避免使用多态)。不幸的是,它依然会慢3倍多。而你仅是放弃了多态的好处。

sales@spasvo.com