Java桌面应用程序性能下降与" clone()"

时间:2014-07-01 17:14:05

标签: java performance opengl garbage-collection cloneable

我正在制作3D OpenGL LWJGL游戏,我用其通用版本替换了3D浮动向量的类,并从“Cloneable”实现了“clone()”方法。之后,性能显着下降(GC使用率从低于1%降至10%)。以下是更改前后矢量版的代码示例:

在:

public class Vec3f {
    public float x, y, z;

    ...

    public Vec3f add(Vec3f v) {
        return new Vec3f(x + v.x, y + v.y, z + v.z);
    }

    public Vec3f addThis(Vec3f v) {
        x += v.x;
        y += v.y;
        z += v.z;
    }
}

后:

public abstract class Vec<V extends Vec<V>> implements Cloneable {
    private Class<V> klass;
    protected float[] coords;

    protected Vec(int dim, Class<V> klass) {
        this(dim, new float[dim], klass);
    }

    public V clone() {
        try {
            V c = klass.newInstance();
            c.coords = this.coords.clone();
            return c;
        }
        catch(InstantiationException e1) {}
        catch(IllegalAccessException e2) {}
        return null;
    }

     ...

    public V add(V that) {
        V sum = this.clone();
        sum.addThis(that);
        return sum;
    }

    public void addThis(V that) {
        for (int i = 0; i < coords.length; i++) {
            coords[i] += that.coords[i];
        }
    }
}


public class Vec3 extends Vec<Vec3> {

    public Vec3() {
        super(3, Vec3.class);
    }
}

但它完全没有意义,因为代码实际上完全相同。

1 个答案:

答案 0 :(得分:0)

GC性能与堆上有多少活动对象有关。代码的第二个版本会创建更多对象,这将为GC创建更多工作。

代码的第二个版本也可能运行得更慢,它使用具有一些开销的反射,并且它可能还会遭受更多CPU缓存未命中,因为它涉及更多指针追踪。

也就是说,将x,y,z作为字段比使用Vec3F类引用的数组更快。