java中多维数组探讨及发散思考
来源:互联网 发布:mac怎么玩穿越火线 编辑:程序博客网 时间:2024/06/03 18:11
今天在stackoverflow上面看到一个帖子讨论说关于提高数组效率的问题,看了下他的问题,是关于一个四维数组的效率问题,四维数组类似这样子:
暂且先不管为啥要搞一个四维数组(毕竟四维已经超出了人的立体思维想象了-_-),我随手写了一个测试类来测试,但是发现了一个更有意思的现象,数组声明方式不同会导致初始化的效率极大区别:
声明方式一:
声明方式二:
方式一花费时间大概为13秒,方式二花费时间不到1秒,而且内存耗费前者为1158000K,后者为342320K,相差3倍。
文字描述就这些,下面直接看代码:
结果:
为什么同样容量的数组,效率却差别如此之大呢?
个人看法:
方式一:
其实相当于:
方式二:
相当于:
- ushort[, , ,] map = new ushort[3000,3000, 3, 3];
ushort[, , ,] map = new ushort[3000, 3000, 3, 3];
暂且先不管为啥要搞一个四维数组(毕竟四维已经超出了人的立体思维想象了-_-),我随手写了一个测试类来测试,但是发现了一个更有意思的现象,数组声明方式不同会导致初始化的效率极大区别:
声明方式一:
- int [][][][] map = newint[3000][3000][3][3];
int [][][][] map = new int[3000][3000][3][3];
声明方式二:
- int [][][][] map2 = newint[3][3][3000][3000];
int [][][][] map2 = new int[3][3][3000][3000];
方式一花费时间大概为13秒,方式二花费时间不到1秒,而且内存耗费前者为1158000K,后者为342320K,相差3倍。
文字描述就这些,下面直接看代码:
- public class MutipleArray {
- public static void main(String[] args) throws InterruptedException {
- long t0 = System.currentTimeMillis();
- int [][][][] map = newint[3000][3000][3][3];
- for (int i = 0; i < 3000; i++)
- for (int j = 0; j < 3000; j++)
- for (int k = 0; k < 3; k++)
- for (int l = 0; l < 3; l++)
- map[i][j][k][l] = 45001;
- long t1 = System.currentTimeMillis();
- System.out.println("Time for initializing the first Array:"+(t1-t0)+"ms");
- int [][][][] map2 = newint[3][3][3000][3000];
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++)
- for (int k = 0; k < 3000; k++)
- for (int l = 0; l < 3000; l++)
- map2[i][j][k][l] = 45001;
- long t2 = System.currentTimeMillis();
- System.out.println("Time for initializing the second Array:"+(t2-t1)+"ms");
- Thread.sleep(10000);
- }
- }
public class MutipleArray { public static void main(String[] args) throws InterruptedException { long t0 = System.currentTimeMillis(); int [][][][] map = new int[3000][3000][3][3]; for (int i = 0; i < 3000; i++) for (int j = 0; j < 3000; j++) for (int k = 0; k < 3; k++) for (int l = 0; l < 3; l++) map[i][j][k][l] = 45001; long t1 = System.currentTimeMillis(); System.out.println("Time for initializing the first Array:"+(t1-t0)+"ms"); int [][][][] map2 = new int[3][3][3000][3000]; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) for (int k = 0; k < 3000; k++) for (int l = 0; l < 3000; l++) map2[i][j][k][l] = 45001; long t2 = System.currentTimeMillis(); System.out.println("Time for initializing the second Array:"+(t2-t1)+"ms"); Thread.sleep(10000); }}
结果:
- Time for initializing the first Array:13570ms
- Time for initializing the second Array:495ms
Time for initializing the first Array:13570msTime for initializing the second Array:495ms
为什么同样容量的数组,效率却差别如此之大呢?
个人看法:
方式一:
- int [][][][] map = newint[3000][3000][3][3];
int [][][][] map = new int[3000][3000][3][3];
其实相当于:
- int [][][][] map = newint[3000*3000*3][3];
int [][][][] map = new int[3000*3000*3][3];
方式二:
- int [][][][] map2 = newint[3][3][3000][3000];
int [][][][] map2 = new int[3][3][3000][3000];
相当于:
- int [][][][] map2 = newint[3*3*3000][3000];
int [][][][] map2 = new int[3*3*3000][3000];
- java中多维数组探讨及发散思考
- MPI多维数组广播,发散
- java数组-二维数组及多维数组
- 数组及多维数组
- 如何在 Java 中创建多维数组
- Java中_多维数组和对象
- c中多维数组及数组指针的理解
- C中数组与指针及多维数组
- 二维数组及多维数组
- java中二维数组(多维数组)的理解认识
- Java多维数组详解
- JAVA中的多维数组
- java 多维数组
- Java多维数组遍历
- java多维数组遍历
- Java 多维数组遍历
- Java 多维数组遍历
- 【JAVA】19、多维数组
- 生产者消费者模式,并发采用ReentrantLock
- java生产者消费者模式代码
- JavaScript实现Struts2+Ajax返回文本字符串
- 关于抓java的dump中live参数
- JAVA经典算法40题(10)
- java中多维数组探讨及发散思考
- 和我一起学 Selenium WebDriver(4)——基础篇
- JCodeModel定义生成代码中的泛型变量
- JDBC DB TableName
- 服务框架HSF分析之三Consumer启动和处理
- jsp页面取struts2 action的变量供java、servlet使用
- Java标签分页实现
- 浏览器图片验证码
- [转载]java命令执行jar包的方式