多态性(显着)比直接实现慢吗?

时间:2015-03-25 11:13:04

标签: java

所以我有这个类基本上是一个实现的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;
    }
}

1 个答案:

答案 0 :(得分:4)

您的代码是一个很好的例子,为什么这样做。你关心表现;但是你对背景背后的情况并没有真正的了解。所以,不要想出你自己的实现......你应该先了解......如果有问题的话。我认为真正的世界场景很少是集合的次要成本要求你使用自定义列表类(参见http://c2.com/cgi/wiki?PrematureOptimization)。

唯一的例外可能是当你处理原始类型时;因为Collection的东西仅供参考(又名Object类型)。然后账单变得非常昂贵;作为具有1000万个整数对象的数组列表&#34;成本&#34;不仅仅是拥有1000万英镑的阵列。

你想出了一个正确的&#34;实施;但正如其他人所指出的那样 - 某些方法会做一些不必要的事情来解释这些性能问题。

请记住:整个集合框架是由专家 java程序员设计和实现的。为什么你认为你的技能会与这些人的技能相匹配?!

这并不意味着侮辱 - 我只是指出创建这样的图书馆是一项最好留给主题专家的任务。

例如,在&#34; Scala&#34;世界语言创造者真正区分正常用户&#34; (编写#34;普通应用程序&#34;)以及那些想要设计/实现框架/库的人。人们普遍认为,后面的任务需要深入了解Scala编程语言的概念和特性。在Java中没有太大的不同。

此外:你知道java just-in-time编译器什么时候效果最好吗?当传入的java字节码看起来像大多数人&#34;的代码时,它最有效。写。当人们试图优化他们的Java源代码时,有很多例子......后来才意识到他们非常特殊的代码会导致性能不足;因为JIT无法优化那个&#34;不寻常的&#34;字节码。