首页 > 试题广场 >

x是一个行列数均为1000二维数组,下面代码效率执行最高的是

[单选题]
x是一个行列数均为1000二维数组,下面代码效率执行最高的是()
  • for(int j=0;j<1000;j++) for(int i=0;i<1000;i++) x[i][j]+=x[j][i];
  • for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) x[i][j]+=x[j][i];
  • for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) x[j][i]+=x[j][i];
  • for(int i=0;i<1000;i++) for(int j=0;j<1000;j++) x[i][j]+=x[i][j];
推荐
选D.
主要是考察了CPU ***的预取操作,数组x[1000][1000]在内存中,是按行进行存储。D选项外部循环是按行进行,因此操作第i行时,会将第i行后面的部分数预取到***中,操作速度最快。
ABC选项其中都有跳列的操作,不能发挥***的预取操作功能。
编辑于 2016-04-13 20:58:37 回复(10)
选D
发表于 2015-08-26 19:08:27 回复(0)
这题选项没写错吗?D会死循环
发表于 2015-08-14 07:16:43 回复(1)

正确答案: D   你的答案: A (错误)

for(int j=0;j<1000;j++) for(int i=0;i<1000;i++) x[i][j]+=x[j][i];
for(int i=0;i<1000;j++) for(int j=0;j<1000;j++) x[i][j]+=x[j][i];
for(int i=0;i<1000;j++) for(int j=0;j<1000;j++) x[j][i]+=x[j][i];
for(int i=0;i<1000;j++) for(int j=0;j<1000;j++) x[i][j]+=x[i][j];

我以为BCD都是死循环,所以就选了A
发表于 2015-08-19 08:28:13 回复(1)
我觉得这道题考的是操作系统课里的知识,关于内存管理策略,页表,那部分的知识。 内存是分成很多个页来管理的,1000x1000的数组相当的大,要用很多页来存储,假设一个页占的内存大小为,1000×4字节=4000字节,那么共需要1000页。而数组存储是先存储按照一行一行来存储数据的,所以,同一行的在同一页,不同行的太不同页。 这样一样,ABC,每存一个数,就得换一个页,不停的查询页表找地址,因而效率贼低。
发表于 2018-01-22 16:30:16 回复(1)
不要在意是不是死循环的问题
我觉得 只有D寻址时间比较少,因为D的寻址是顺序的
其他选项寻址需要“跳”,来找到对应地址  
最佳答案说的不错 肯定是顺序寻址消耗时间最少的
发表于 2015-09-06 12:52:16 回复(1)
二维数组按行存取,每次如果按列访问那么就会有大量***无法命中,因此访问效率就不高了
发表于 2015-08-18 22:52:40 回复(0)
选D,指令预取提高效率。题中外层循环写错了,应该是i++
发表于 2015-08-15 09:43:53 回复(0)
停!这就是考操作系统的
发表于 2020-11-29 21:07:33 回复(0)
A和B是因为catche预读的原因,C是因为死循环了,所以选D啊!
发表于 2015-09-29 14:47:06 回复(0)
选D 
将前面人的答案手打下,提高印象,主要考察CPU ***的预取操作(原谅我不知道这个点)
在数组x[1000][1000]在内存中,是按行进行存储的,D是外部循环按行进行,因此操作第i行时,会将第i行后面的部分数预取到***中,操作速度最快。
ABC选项中都有跳列的操作,不能发挥***的预取操作功能。
发表于 2018-03-24 15:17:36 回复(1)
不懂的去看csapp
发表于 2020-03-10 10:27:21 回复(0)
计算机组成原理里的东西,自己差的太远了。
发表于 2017-03-14 23:24:00 回复(0)
反正我是看不懂
发表于 2015-08-17 02:33:59 回复(0)
数组是按顺序、连续的内存存储的,ABC每一次循环都有换列操作,意味着每一次操作都要访问到内存与上一次操作的内存不连续的地方,所以效率比D低。
发表于 2024-03-10 15:03:05 回复(0)
for循环次数有限,怎么会陷入死循环?
发表于 2023-03-29 00:35:19 回复(0)
涉及到操作系统,数组内存存储
发表于 2023-03-15 10:05:58 回复(0)
这题考的是空间局部性原理,或者也可以说是虚拟内存,因为二维数组在内存中是按每行排列的,所以内存中下一个位置应该是当前位置的行不变,列加1的元素,如果按照列顺序读取,那么如果当前块内存命中了,那么接下来的好几个元素也会命中,然而如果按照行读取,比如4行4列的二维数组,那么在内存中就是每隔四个元素读取,这样就会导致虚拟内存页面不停的换入换出,内存不命中的次数很高,惩罚时间也就越长,因此效率越低,我说的可能不太好,但是如果真想理解这道题,建议看两个知识点1局部性原理2虚拟内存,看完了就懂了
发表于 2022-07-16 09:52:42 回复(0)
知道按行存取 但是这都是啥 写的密密麻麻
发表于 2022-04-07 20:17:00 回复(0)
二维数组在内存中是按照行主序的方式进行存储的,选项D就是按照内存的存储顺序顺序的访问数组的元素,具有空间局限性(即访问了一块内存,那么与它相邻的内存也将大概率被访问)。
发表于 2022-03-24 14:14:29 回复(0)
我的理解,只有D是合并访存的,读和写
发表于 2021-07-16 09:37:18 回复(0)