Java嵌套循环速度快慢问题

chenmike1 2018-03-10 11:13:14

int[] a=new int[20000];
int[] b=new int[500000];
public void meth1(){
for(int i=0;i<a.length;i++){
for(int j=0;j<b.length;j++){
b[j]++;
}
}
}

public void meth2(){
for(int i=0;i<b.length;i++){
for(int j=0;j<a.length;j++){
a[j]++;
}
}
}

请问这两种方法哪一种更快 为什么
...全文
1054 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
测了下时间一样
chenmike1 2018-04-11
  • 打赏
  • 举报
回复
引用 1 楼 still_rain 的回复:
这个自己可以测试下。应该是 meth2稍微快一些。进行数组访问时,操作系统需要将相关内存页面载入cache中,一个页面的大小是有限的,如果程序需要访问页面外的内存数据,操作系统需要进行换页操作,这个操作是耗时的。meth1访问的内存区域大小为500000,系统不需要或极少需要换页。meth2需要访问的内存区域大小为20000,系统需要多次换页,比较耗时。简单的讲, meth2具有较好的程序局部性。这题需要具备一些操作系统或微机原理的知识。
请问是口误了吗,你说meth2需要多次换页,那应该是meth1更快一些咯?
yjsl__ 2018-04-11
  • 打赏
  • 举报
回复
应该用二维数组测试的,想象一个2x2的4个格子的容器,第一行为二维数组的第一个元素(第一个一维数组)a0,第二行为a1,a0中有两个元素b0,b1,操作系统在加载a这个二维数组时,按需加载,先加载第一行,再加载第二行,如果遍历的顺序恰好是b0,b1,那么不需要做内存的页相关操作,如果遍历的顺序是b0,b3,b1,b4,那么就要不停的换页,效率低
爱摸鱼de老邪 2018-03-10
  • 打赏
  • 举报
回复
这个自己可以测试下。应该是 meth2稍微快一些。进行数组访问时,操作系统需要将相关内存页面载入cache中,一个页面的大小是有限的,如果程序需要访问页面外的内存数据,操作系统需要进行换页操作,这个操作是耗时的。meth1访问的内存区域大小为500000,系统不需要或极少需要换页。meth2需要访问的内存区域大小为20000,系统需要多次换页,比较耗时。简单的讲, meth2具有较好的程序局部性。这题需要具备一些操作系统或微机原理的知识。

50,639

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧