3D OpenGL LWJGL ゲームを作成しています。3D float ベクトルのクラスをその汎用バージョンに置き換え、「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);
}
}
しかし、コードは実際にはまったく同じことを行うため、まったく意味がありません。