二维数组有两种遍历方式,一种是先行后列,一种是先列后行,代码实现也很简单,用两个for循环嵌套即可,表面上看来,二者时间复杂度都是O(mn),但实际上,判断效率的是通过内存页面交换次数和Cache命中率的高低来判断的。
先行后列的效率要高的多,这个与二维数组的存储方式有关,例如对于int
b[128][1024];假设内存页大小为4096字节,该数组每行正好占据一个内存页的空间,若按先行后列遍历,外层循环每走一行,内层走过1024个元素正好一页,没发生页面调度,遍历完整个数组页面调度次数最多为128次;若按先列后行,则每遍历一个元素,都发生一次页面调度,因为列上每个元素位于同行内(不同页),遍历整个数组页面调度次数可能达到1024*128次;实际中由于物理内存足够,调度次数会减少很多。
二维数组放入CACHE
最新推荐文章于 2022-05-04 10:47:21 发布