今天在stackoverflow上面看到一个帖子讨论说关于提高数组效率的问题,看了下他的问题,是关于一个四维数组的效率问题,四维数组类似这样子:
ushort[, , ,] map = new ushort[3000, 3000, 3, 3];
暂且先不管为啥要搞一个四维数组(毕竟四维已经超出了人的立体思维想象了-_-),我随手写了一个测试类来测试,但是发现了一个更有意思的现象,数组声明方式不同会导致初始化的效率极大区别:
声明方式一:
int [][][][] map = new int[3000][3000][3][3];
声明方式二:
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 = 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
为什么同样容量的数组,效率却差别如此之大呢?
个人看法:
方式一:
int [][][][] map = new int[3000][3000][3][3];
其实相当于:
int [][][][] map = new int[3000*3000*3][3];
方式二:
int [][][][] map2 = new int[3][3][3000][3000];
相当于:
int [][][][] map2 = new int[3*3*3000][3000];
方式一需要JVM为map开辟3000*3000*3个内存大小为4个字节的3个连续空间。
方式二需要JVM为map1开辟3*3*3000个内存大小为4个字节的3000个连续空间,这一下子就把时间效率区别开了。但是为什么二者所占的内存大小却也相差3倍左右呢?没有继续探究,希望能抛砖引玉,大家在此讨论一下。
分享到:
相关推荐
对C#中多维数组,进行学习.实现多维数组的输入和输出. 源码. 实现对多维数组的动态输入,和多维数组的输出.
详解java多维数组,提高对java多维数组的理解
多维数组程序设计 多维数组程序设计 多维数组程序设计
多维数组下标计算多维数组下标计算多维数组下标计算多维数组下标计算多维数组下标计算多维数组下标计算
Java中多维数组.pdf 学习资料 复习资料 教学资源
易语言重定义多维数组源码,重定义多维数组,min,pInt,pInts,RtlCopyMemory,RtlMoveMemory
本资源关于数据结构中的多维数组的设计与使用
VB 多维数组实例 VB 多维数组实例 VB 多维数组实例
易语言赋值定义多维数组源码,赋值定义多维数组
此实例解释了new动态创建多维数组的用法,还有包涵了多维数组指针的用法···
易语言子程序返回多维数组的实现方法源码,子程序返回多维数组的实现方法,返回列表框数组
Java中使用数组完成学生成绩统计的多种实现代码清单.pdf 学习资料 复习资料 教学资源
Java语言编程 多维数组 Java语言编程 多维数组
题目: 假定本学期某班上有5门课,该班上有10人 (1) 请输入该班同学的学号,姓名,5门课的成绩至数组A、B中,再按5门课的总分排序,然后列出排序后的序号,学号,姓名,成绩1~5; (2) 求出5门课的平均成绩
交错数组和多维数组 本容收集的一些关于交错数组和多维数组介绍,希望大家踊跃下载!仅供参考!!
易语言源码赋值定义多维数组.rar 易语言源码赋值定义多维数组.rar 易语言源码赋值定义多维数组.rar 易语言源码赋值定义多维数组.rar 易语言源码赋值定义多维数组.rar 易语言源码赋值定义多维数组.rar
对多维数组,对象,进行去重,相同的值只保留一个,常见的new Set()和filter,只能去重一维数组,并不能进行深层的去重,逻辑:判断是否为对象,为对象判断是否为数组或是真的对象,递归一直筛选为值,判断首次...
php 多维数组排序,应用php的多维数组排序函数
java100例之实例3 演示一维数组和多维数组的初始化和基本操作.rar
严蔚敏习题集上的课程设计,比较容易理解的