[英]Is Polymorphism (significantly)slower than direct implementations?
所以我有这个类基本上是一个实现的ArrayList,我希望通过使用java实现来使使用这个类的代码运行得更快,相反,它的运行速度几乎是它的两倍。 这背后是否有任何明显的原因让我失踪? 它是否意味着这样慢?
原始手写代码:
public class VertexSet {
private int[] _set = null;
private int _sp;
public final static int INIT_SIZE = 10, INC = 30;
public VertexSet() {
_set = new int[INIT_SIZE];
_sp = 0;
}
public VertexSet(VertexSet ot) {
_set = new int[INIT_SIZE];
_sp = 0;
for(int i = 0; i < ot.size(); ++i) this.add(ot.at(i));
}
public void add(int a) {
if(_sp == _set.length) resize();
_set[_sp] = a;
++_sp;
}
public int size() {return _sp;}
public int at(int i) {return _set[i];}
public String toString() {
String ans = "Set: |" + size() + "| ";
for(int i = 0; i < size(); ++i) ans+=this.at(i) + ", ";
return ans;
}
public String toFile() {
String ans = " ";
for(int i = 0; i < size(); ++i) ans += this.at(i) + ", ";
return ans;
}
/**
* this method computes the intersection between this set and ot set.
* @param ot - the other set
*/
public VertexSet intersection(VertexSet ot) {
VertexSet ans = new VertexSet();
int i1 = 0, i2 = 0, a1, a2;
while(i1<this.size() & i2 < ot.size()) {
a1=this.at(i1);
a2 = ot.at(i2);
if(a1 == a2) {
ans.add(a1); ++i1; ++i2;}
else if(a1 < a2) {++i1;}
else ++i2;
}
return ans;
}
private void resize() {
int[] tmp = new int[_sp + INC];
for(int i = 0; i < _sp; ++i) tmp[i] = _set[i];
_set = tmp;
}
}
扩展java实现后的手写代码:
import java.util.ArrayList;
public class VertexSet extends ArrayList<Integer>{
public final static int INIT_SIZE = 10;
public VertexSet() {
super(INIT_SIZE);
}
public VertexSet(VertexSet ot) {
super(ot);
}
public int at(int i) {return get(i);}
public String toString() {
String ans = "Set: |" + size() + "| ";
for(int i = 0; i < size(); ++i) ans+=this.at(i) + ", ";
return ans;
}
public String toFile() {
String ans = " ";
for(int i = 0; i < size(); ++i) ans += this.at(i) + ", ";
return ans;
}
/**
* this method computes the intersection between this set and ot set.
* @param ot - the other set
*/
public VertexSet intersection(VertexSet ot) {
VertexSet ans = new VertexSet();
int i1 = 0, i2 = 0, a1, a2;
while(i1<this.size() & i2 < ot.size()) {
a1=this.at(i1);
a2 = ot.at(i2);
if(a1 == a2) {
ans.add(a1); ++i1; ++i2;}
else if(a1 < a2) {++i1;}
else ++i2;
}
return ans;
}
}
您的代码是一个很好的例子,为什么不这样做。 你关心表现; 但是你对背景背后的情况并没有真正的了解。 所以,不要想出你自己的实现......你应该先了解......如果有问题的话。 我认为真正的世界场景很少是集合的次要成本要求您使用自定义列表类(请参阅http://c2.com/cgi/wiki?PrematureOptimization )。
唯一的例外可能是当你处理原始类型时; 因为Collection的东西仅供参考(又名Object类型)。 然后账单变得非常昂贵; 作为具有1000万个整数对象的ArrayList,“成本”远远超过具有1000万个整数的数组。
你想出了一个“正确”的实现; 但正如其他人所指出的那样 - 某些方法会做一些不必要的事情来解释这些性能问题。
请记住:整个集合框架是由专业的 Java程序员设计和实现的。 为什么你认为你的技能会与这些人的技能相匹配?!
这并不意味着侮辱 - 我只是指出创建这样的库是一项最好留给主题专家的任务。
例如,在“Scala”世界中,语言创建者真正区分“普通用户”(写“普通应用程序”)和那些想要设计/实现框架/库的人。 人们普遍认为,后面的任务需要更深入地了解Scala编程语言的概念和特性。 在Java中没有太大的不同。
此外:你知道Java即时编译器何时效果最好? 当传入的java字节码看起来像“大多数人”编写的代码时,它最有效。 当人们试图优化他们的Java源代码时,有很多例子......后来才意识到他们非常特殊的代码会导致性能不足; 因为JIT无法优化那个“不寻常”的字节码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.