java中多维数组探讨及发散思考

来源:互联网 发布:mac怎么玩穿越火线 编辑:程序博客网 时间:2024/06/03 18:11
今天在stackoverflow上面看到一个帖子讨论说关于提高数组效率的问题,看了下他的问题,是关于一个四维数组的效率问题,四维数组类似这样子:
Java代码 复制代码 收藏代码
  1. ushort[, , ,] map = new ushort[3000,3000, 3, 3];

暂且先不管为啥要搞一个四维数组(毕竟四维已经超出了人的立体思维想象了-_-),我随手写了一个测试类来测试,但是发现了一个更有意思的现象,数组声明方式不同会导致初始化的效率极大区别:
声明方式一:
Java代码 复制代码 收藏代码
  1. int [][][][] map = newint[3000][3000][3][3];

声明方式二:
Java代码 复制代码 收藏代码
  1. int [][][][] map2 = newint[3][3][3000][3000];

方式一花费时间大概为13秒,方式二花费时间不到1秒,而且内存耗费前者为1158000K,后者为342320K,相差3倍。
文字描述就这些,下面直接看代码:
Java代码 复制代码 收藏代码
  1. public class MutipleArray {
  2. public static void main(String[] args) throws InterruptedException {
  3. long t0 = System.currentTimeMillis();
  4. int [][][][] map = newint[3000][3000][3][3];
  5. for (int i = 0; i < 3000; i++)
  6. for (int j = 0; j < 3000; j++)
  7. for (int k = 0; k < 3; k++)
  8. for (int l = 0; l < 3; l++)
  9. map[i][j][k][l] = 45001;
  10. long t1 = System.currentTimeMillis();
  11. System.out.println("Time for initializing the first Array:"+(t1-t0)+"ms");
  12. int [][][][] map2 = newint[3][3][3000][3000];
  13. for (int i = 0; i < 3; i++)
  14. for (int j = 0; j < 3; j++)
  15. for (int k = 0; k < 3000; k++)
  16. for (int l = 0; l < 3000; l++)
  17. map2[i][j][k][l] = 45001;
  18. long t2 = System.currentTimeMillis();
  19. System.out.println("Time for initializing the second Array:"+(t2-t1)+"ms");
  20. Thread.sleep(10000);
  21. }
  22. }

结果:
Java代码 复制代码 收藏代码
  1. Time for initializing the first Array:13570ms
  2. Time for initializing the second Array:495ms


为什么同样容量的数组,效率却差别如此之大呢?
个人看法:
方式一:
Java代码 复制代码 收藏代码
  1. int [][][][] map = newint[3000][3000][3][3];

其实相当于:
Java代码 复制代码 收藏代码
  1. int [][][][] map = newint[3000*3000*3][3];

方式二:
Java代码 复制代码 收藏代码
  1. int [][][][] map2 = newint[3][3][3000][3000];

相当于:
Java代码 复制代码 收藏代码
  1. int [][][][] map2 = newint[3*3*3000][3000];