java数组为什么可以迭代吗_在迭代2D数组时,为什么循环的顺序会影响性能?

正如其他人所说,问题是存储到数组中的内存位置: x[i][j] . 以下是一些有用的原因:

你有一个二维数组,但计算机中的内存本质上是一维的 . 所以当你想象你的阵列是这样的:

0,0 | 0,1 | 0,2 | 0,3

----+-----+-----+----

1,0 | 1,1 | 1,2 | 1,3

----+-----+-----+----

2,0 | 2,1 | 2,2 | 2,3

您的计算机将其作为一行存储在内存中:

0,0 | 0,1 | 0,2 | 0,3 | 1,0 | 1,1 | 1,2 | 1,3 | 2,0 | 2,1 | 2,2 | 2,3

在第二个例子中,首先通过循环第二个数字来访问数组,即:

x[0][0]

x[0][1]

x[0][2]

x[0][3]

x[1][0] etc...

这意味着你按顺序击中它们 . 现在看第一个版本 . 你在做:

x[0][0]

x[1][0]

x[2][0]

x[0][1]

x[1][1] etc...

由于C在内存中布置2-d数组的方式,你要求它在整个地方跳跃 . 但现在对于踢球者:为什么这很重要?所有内存访问都是一样的,对吧?

不:因为缓存 . 来自内存的数据以小块(称为“缓存行”)传递给CPU,通常为64字节 . 如果你有4字节的整数,那意味着你要在一个整齐的小包中找到16个连续的整数 . 获取这些内存块实际上相当慢;您的CPU可以在加载单个缓存行所需的时间内完成大量工作 .

现在回顾一下访问顺序:第二个例子是(1)抓取一个16个整数的块,(2)修改所有这些,(3)重复4000 * 4000/16次 . 这很好用而且速度很快,而且CPU总是有一些工作要做 .

第一个例子是(1)抓取一个16个整数的块,(2)只修改其中一个,(3)重复4000 * 4000次 . 这将需要16倍于内存中“提取”的数量 . 你的CPU实际上必须花时间坐在那里等待记忆显示出来,而当它坐在你周围时你会浪费宝贵的时间 .

Important Note:

既然你有了答案,这里有一个有趣的说明:你的第二个例子必须是快速的,没有固有的原因 . 例如,在Fortran中,第一个例子很快,第二个例子很慢 . 这是因为Fortran不是像C那样将事物扩展成概念性的“行”,而是扩展为“列”,即:

0,0 | 1,0 | 2,0 | 0,1 | 1,1 | 2,1 | 0,2 | 1,2 | 2,2 | 0,3 | 1,3 | 2,3

C的布局称为'row-major'和Fortran 's is called ' column-major '. As you can see, it'非常重要,以了解您的编程语言是行主要还是列主要!这是一个更多信息的链接:http://en.wikipedia.org/wiki/Row-major_order

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值