我可以通过转置2d数组来优化我的java编程吗?

时间:2013-09-17 15:51:16

标签: java matrix ram

我有:

final int ROWS = 100000;
final int COLS = 2000;
long[][] m = new long[COLS][ROWS];

然后:

public void xor(int row1, int row2) {
    for (int col=0; col<COLS; col++) {
        m[col][row1] ^= m[col][row2];
    }
}

上述功能简化了运行中大部分时间的功能。我想知道我是否应该花时间重构我的整个程序来读取“m = new long [ROWS] [COLS]”(而不是相反)来获得更好的RAM访问。或者我不会赢得很多时间吗?

我知道我可能会将它与GPU相提并论,但那是在后期阶段。

1 个答案:

答案 0 :(得分:1)

在我看来,它肯定有助于交换ROWS和COLS。

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

由于每列都是800000字节,并且在xor方法中您可以访问所有这些字段,因此会导致更多缓存未命中。

在转置后,每一行都会成为连续的内存,并且由于您倾向于对行进行操作,因此应该使其更快。

如果你有long[][] m = new long[ROWS][COLS];for (int col=0; col<COLS; col++) m[row1][col] ^= m[row2][col];,那么在执行xor方法期间,你只需要两个16000字节长的行。

但是,由于我所说的主要基于理论,因此尝试对两种变体进行基准测试,并检查哪种变体真的更快。