C++ 性能小测 1 二维数组的遍历效率

遍历二维数组时,常规思路是使用一个嵌套循环。一方面,由于 CPU 使用了分支预测技术,因此通常将循环次数最多循环的放在最内层。另一方面,由于二维数组是按行存储的,因此遍历二维数组时,一般将列循环放在内层。但当数组的行数rowSize大于数组的列数columnSize时,这两条规律无法同时得到满足。下面通过一个小测试来判断这个时候哪种方式效率更高。

#include <iostream>
#include <ctime> using namespace std; const int rowSize = 50000;
const int columnSize = 2000;
const int testCount = 100; int main()
{
//生成大型二维数组
int** arr = new int * [rowSize];
for (int i = 0; i < rowSize; i++)
{
arr[i] = new int[columnSize];
for (int j = 0; j < columnSize; j++)
{
arr[i][j] = rand() % 5;
}
} //声明工具变量
double meanTime = 0;
long double sum = 0;
clock_t start, end, time; //将列循环放在内层,进行多次测试
time = 0;
for (int k = 0; k < testCount; ++k)
{
sum = 0;
start = clock();
for (int i = 0; i < rowSize; ++i)
{
for (int j = 0; j < columnSize; ++j)
{
sum += arr[i][j];
}
}
end = clock();
sum = sum / (rowSize * columnSize);
time += end - start;
}
meanTime = (double) time / testCount / CLOCKS_PER_SEC;
cout << "列循环放在内层平均耗时" << meanTime << "秒,平均值为" << sum << endl; //将列循环放在外层,进行多次测试
time = 0;
for (int k = 0; k < testCount; ++k)
{
sum = 0;
start = clock();
for (int j = 0; j < columnSize; ++j)
{
for (int i = 0; i < rowSize; ++i)
{
sum += arr[i][j];
}
}
end = clock();
sum = sum / (rowSize * columnSize);
time += end - start;
}
meanTime = (double) time / testCount / CLOCKS_PER_SEC;
cout << "列循环放在外层平均耗时" << meanTime << "秒,平均值为" << sum << endl; //释放大型二维数组内存
for (int i = 0; i < rowSize; i++)
delete[] arr[i];
delete[] arr; system("pause");
return 0;
}

测试输出如下:

列循环放在内层平均耗时0.42657秒,平均值为1.99975
列循环放在外层平均耗时1.35246秒,平均值为1.99975
请按任意键继续. . .

由此可得:使用嵌套循环遍历二维数组时,将列循环放在内层运行效率更高,即使所遍历的二维数组行数远大于列数。

C++ 性能小测 1 二维数组的遍历效率的更多相关文章

  1. 元素均匀排列自动换行&二维数组前端遍历

    1.元素均匀排列并自动换行 display:flex; flex-wrap:wrap; 2.getFiled();取一行,取多行的话用getFiled(‘id’,true); 3.二维数组前端遍历: ...

  2. PHP开发小技巧②—实现二维数组根据key进行排序

    在PHP中内置了很多对数组进行处理的函数,有很多时候我们直接使用其内置函数就能达到我们的需求,得到我们所想要的结果:但是,有的时候我们却不能通过使用内置函数实现我们的要求,这就需要我们自己去编写算法来 ...

  3. PHP针对二维数组无限遍历变形研究

    一.需要变形的二维数组 $arr = Array( Array ( 'material_id' => 1, 'material_name' => '铜板纸', 'parent_id' =& ...

  4. 二维数组初始化 遍历 动态赋值 内存图 Day08

    package com.sxt.arraytest3; /* * 二维数组 */ public class TestArray { public static void main(String[] a ...

  5. Openjudge-NOI题库-二维数组回形遍历

    题目描述 Description 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组.如图所示:  输入输出格式 Input/ou ...

  6. vector 定义的二维数组的遍历

    之前我们分享了STL的一些容器,再介绍vector中只介绍了二维的vector的定义并没有说二维的vector怎么遍历,那么我们今天就来看下二维的vector怎么遍历 看下面的代码吧. #includ ...

  7. 存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?

    这是牛客网上的一道题~ 题意:对数组排序,顺序是按照数组的平均值,即按照一个元素和平均值相减的绝对值的大小来排序...本例按这个绝对值递增排序 解题思想:先求出这个数组的平均值,如果 a<b,那 ...

  8. Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

    要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...

  9. C#学习笔记04--排序/查找/二维数组/交叉数组

    一. 冒泡排序(重点) 思路:  每次比较把较小的放在前面, 大的放到后面; 图解:下图是最坏情况下的排序 ` 冒泡排序m个元素, 就有(m-1)趟排序, 第一趟m-1次, 第二趟 m-2次....  ...

随机推荐

  1. ”只用 1 分钟“ - 超简极速 Apk 签名 & 多渠道打包神器

    众所周知,渠道包作为当下国内 Android 应用市场常见的分发方式,当 APP 和后台交互或进行数据上报时,会带上各自的 channel 渠道信息,以此方便企业 & 开发者统计 APP 在各 ...

  2. .NET中的 Count()、Count、Length 有什么不同

    更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年7月15日. Count().Count.Length,都用于获得序列长度或者说元素的个数,但它们有什么明确的区 ...

  3. .NET中测试代码运行时间

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年6月29日. 计算代码运行的时间,除了呆萌地用秒表去计时,或者可以通过Visual Studio来查看,还可以在.NET代码中使用St ...

  4. C# 将XML转为PDF

    XML,即可扩展标记语言文,件是一种标准的文本文件,它使用特定的标记来描述文档的结构以及其他特性.通过将 XML 文档转换为 PDF格式,能够满足更多程序.设备对文件预览.读取或展示的需要,也更便于文 ...

  5. Map集合中的同一键值key重复赋值

    前言: 验证:对Map集合中的同一键值key重复赋值? 结果:对Map集合中的同一键值key重复赋值会覆盖之前的结果. 验证如下: Map<String, Object> map = ne ...

  6. typescript+webpack构建一个js库

    依赖说明 入口文件 tsconfig配置 webpack配置文件 webpack入口文件配置 webpack为typescript和less文件配置各自的loader webpack的output配置 ...

  7. Trie 树进阶学习笔记

    前言 没脑子选手发现自己什么都不会 ... \(\text{More and more vegetables, What should I do?}\) 正文 Trie 树简介 大概是人类的话都知道吧 ...

  8. Pytorch从0开始实现YOLO V3指南 part2——搭建网络结构层

    本节翻译自:https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch ...

  9. java-Stream的总结

    JAVA中的Stream 01.什么是Stream Stream是JDK8中引入,Stream是一个来自数据源的元素序列并支持聚合操作.可以让你以一种声明的方式处理数据,Stream 使用一种类似用 ...

  10. StringBuilder的构造方法和append方法

    Java中StringBuilder的构造方法 StringBuilder构造方法: public StringBuilder(): 创建一个空白可变的字符串对象,不含有任何内容 public Str ...