美文网首页
二维数组按行和按列遍历效率哪个高?

二维数组按行和按列遍历效率哪个高?

作者: darkness605 | 来源:发表于2020-11-16 11:28 被阅读0次

转自:https://www.cnblogs.com/albert32/p/13414825.html

按行遍历效率高。
对c语言而言,数组在内存中是按行储存的,按行遍历时可以由指向数组第一个数的指针一直往下走,就可以遍历完整个数组,而按列遍历则要获得指向每一列的第一行的元素的指针,然后每次将指针指下一行,但是指针的寻址很快,所以不会有明显的区别。

按行遍历比按列遍历效率高体现在哪里呢?

1、CPU高速缓存:(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。
当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。
缓存从内存中抓取一般都是整个数据块,所以它的物理内存是连续的,几乎都是同行不同列的,而如果内循环以列的方式进行遍历的话,将会使整个缓存块无法被利用,而不得不从内存中读取数据,而从内存读取速度是远远小于从缓存中读取数据的。

2、分页调度:物理内存是以页的方式进行划分的,当一个二维数组很大是如 int[128][1024],假设一页的内存为4096个字节,而每一行正好占据内存的一页,如果以列的形式进行遍历,就会发生128*1024次的页面调度,而如果以行遍历则只有128次页面调度,而页面调度是有时间消耗的,因而调度次数越多,遍历的时间就越长。

局部性原理: CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。

三种不同类型的局部性:

1、时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。
程序循环、堆栈等是产生时间局部性的原因。

2、空间局部性(Spatial Locality):在最近的将来将用到的信息很可能与正在使用的信息在空间地址上是临近的。

3、顺序局部性(Order Locality):在典型程序中,除转移类指令外,大部分指令是顺序进行的。顺序执行和非顺序执行的比例大致是5:1。此外,对大型数组访问也是顺序的。
指令的顺序执行、数组的连续存放等是产生顺序局部性的原因。

相关文章

  • 有意思的题目

    矩阵按行遍历和按列遍历哪个效率高? 按行遍历效率高。 原因 1.二维数组的内存地址是连续的,当前行的尾与下一行的头...

  • 你没有关注过的二维数组遍历效率

    二维数组的排列顺序 数组在内存中是按行存储的,按行遍历时可以由指向数组的第一个数的指针一直向后遍历,由于二维数组的...

  • 矩阵中的幸运数

    题目: 题目的理解: 按行遍历二维数组,获取一行中的最小值A和所在的索引。获取所在索引的列,求最大值B。判断A和B...

  • 2018-05-19算法与数据结构

    知识体系 数组 计算存储地址:1.按行还是按列存储;2.每个元素所占的字节 例题:已知5行5列的二维数组a中的各个...

  • 软考-非线性结构(上)

    1.二维数组与三对角矩阵 1.1:二维数组 a[1..N,1..N]可以按行存储或按列存储。对于数组元素a[i,j...

  • 13 apply,lapply,sapply

    1. apply函数 X:数组、矩阵、数据框MARGIN: 按行计算或按按列计算,1表示按行,2表示按列FUN: ...

  • 二维数组按列求和

    然后,看到了网上大哥们的奇淫巧技快速声明一个数据并初始化(记录一下): Array.prototype.fill(...

  • 剑指offer-python

    二维数组中的查找 Q: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按...

  • 剑指offer刷题笔记1

    1. 二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按...

  • 剑指offer每日一更

    题目 // 面试题4:二维数组中的查找// 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按...

网友评论

      本文标题:二维数组按行和按列遍历效率哪个高?

      本文链接:https://www.haomeiwen.com/subject/gqxtiktx.html