我可以通过转换2d数组来优化java程序吗?

我可以通过转换2d数组来优化java程序吗?,java,matrix,ram,Java,Matrix,Ram,我有: 然后: final int ROWS = 100000; final int COLS = 2000; long[][] m = new long[COLS][ROWS]; public void异或(int-row1,int-row2){ 对于(int col=0;col,在我看来,交换行和列肯定会有帮助 此数组的布局(大致)如下:[0][0]、[0][1]、[0][2]、…[1][0]、[1][1]、…等等。在您的代码中,每一列都是一个连续的内存块,而每一行都不是 由于每列都是80

我有:

然后:

final int ROWS = 100000;
final int COLS = 2000;
long[][] m = new long[COLS][ROWS];
public void异或(int-row1,int-row2){

对于(int col=0;col,在我看来,交换行和列肯定会有帮助

此数组的布局(大致)如下:[0][0]、[0][1]、[0][2]、…[1][0]、[1][1]、…等等。在您的代码中,每一列都是一个连续的内存块,而每一行都不是

由于每列都是800000字节,并且在
xor
方法中您可以访问所有列,因此您将强制执行更多的缓存未命中

在转置之后,每一行都成为一个连续的内存块,而且由于您倾向于对行进行操作,因此应该使它更快


如果您有
long[]]m=新的long[ROWS][COLS];
用于(int col=0;col你想做什么?除非我对你试图通过优化解决的问题有更多的了解,否则我无法回答。这些数字是有意义的。听起来很值得一试,所以我会的。稍后会有结果。打得好!我的主循环迭代过去需要8小时。现在是3小时:)。有趣的旁注:内存的初始化(m=new int[…][…])从20秒增加到了4分钟(我不知道为什么)。可能是因为现在有了更多的行,所以创建了更多的
long[]
对象。
public void xor(int row1, int row2) {
    for (int col=0; col<COLS; col++) {
        m[col][row1] ^= m[col][row2];
    }
}