dre*_*ash 5 java arrays algorithm performance class
我想知道如何(如果可能的话)我可以使用数据布局编写Java类Array of Class,例如:
public class X{
double a;
double b;
double c;
}
public X array_of_x[SIZE] = new X [SIZE];
Run Code Online (Sandbox Code Playgroud)
但在内部数据将存储为这样的布局Class of Arrays:
public class X{
double a[] = new double [SIZE];
double b[] = new double [SIZE];
double c[] = new double [SIZE];
}
public X class_x = new X();
Run Code Online (Sandbox Code Playgroud)
我的目标是程序员可以像第一个那样以更直观的方式编程,但内部我会进行转换,因此数据可以在内存中连续,我会获得更多的性能.
有没有办法这样做,所以它可以接受任何具有第一类结构的类,并能够将其转换为第二种方法?(或者是能够进行此类转换的任何工具).
让我们创建一个展示第一个使用布局的界面,以及在内部使用第二个布局的该界面的实现。(从代码中删除访问修饰符。)
interface X {
double getA();
double getB();
double getC();
};
interface ArrayOfX {
X get(int index);
};
class ContiguousArrayOfX implements ArrayOfX {
class ContiguousX implements X {
int index;
ContiguousX(int index) {
this.index = index; }
double getA() { return a[index]; }
double getB() { return b[index]; }
double getC() { return c[index]; }
}
X get(int index) {
return new ContiguousX(index); }
double a[] = new double [SIZE];
double b[] = new double [SIZE];
double c[] = new double [SIZE];
};
Run Code Online (Sandbox Code Playgroud)
如果你想减轻GC的负担,你也可以缓存所有的实例ContiguousX。ContiguousX如果对象完全分配在堆上,这在很大程度上取决于 JIT 编译器的能力——它们很可能位于堆栈中,在这种情况下,开销可以忽略不计。作为最后的手段,您可以定义一个替代接口来快速访问:
interface FasterArrayOfX {
double getA(int index);
double getB(int index);
double getC(int index);
};
class FasterContiguousArrayOfX extends ContiguousArrayOfX implements FasterArrayOfX {
// Exercise left to the reader
};
Run Code Online (Sandbox Code Playgroud)
通过针对接口进行编程,您以后可以随时自由选择存储。
为任何给定的类布局编写代码生成器相当简单。上面的代码可以用作样板,只有方法和数组声明取决于您想要获取的类布局。我不知道有任何现有工具。