C++ 性能小测 1 二维数组的遍历效率
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.元素均匀排列并自动换行 display:flex; flex-wrap:wrap; 2.getFiled();取一行,取多行的话用getFiled(‘id’,true); 3.二维数组前端遍历: ...
- PHP开发小技巧②—实现二维数组根据key进行排序
在PHP中内置了很多对数组进行处理的函数,有很多时候我们直接使用其内置函数就能达到我们的需求,得到我们所想要的结果:但是,有的时候我们却不能通过使用内置函数实现我们的要求,这就需要我们自己去编写算法来 ...
- PHP针对二维数组无限遍历变形研究
一.需要变形的二维数组 $arr = Array( Array ( 'material_id' => 1, 'material_name' => '铜板纸', 'parent_id' =& ...
- 二维数组初始化 遍历 动态赋值 内存图 Day08
package com.sxt.arraytest3; /* * 二维数组 */ public class TestArray { public static void main(String[] a ...
- Openjudge-NOI题库-二维数组回形遍历
题目描述 Description 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组.如图所示: 输入输出格式 Input/ou ...
- vector 定义的二维数组的遍历
之前我们分享了STL的一些容器,再介绍vector中只介绍了二维的vector的定义并没有说二维的vector怎么遍历,那么我们今天就来看下二维的vector怎么遍历 看下面的代码吧. #includ ...
- 存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?
这是牛客网上的一道题~ 题意:对数组排序,顺序是按照数组的平均值,即按照一个元素和平均值相减的绝对值的大小来排序...本例按这个绝对值递增排序 解题思想:先求出这个数组的平均值,如果 a<b,那 ...
- Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...
- C#学习笔记04--排序/查找/二维数组/交叉数组
一. 冒泡排序(重点) 思路: 每次比较把较小的放在前面, 大的放到后面; 图解:下图是最坏情况下的排序 ` 冒泡排序m个元素, 就有(m-1)趟排序, 第一趟m-1次, 第二趟 m-2次.... ...
随机推荐
- JS:条件语句1
条件语句: 1.if...else if (condition1) { 当条件 1 为 true 时执行 } else { 当条件 1 不为 true 时执行 } if (condition1) { ...
- python基础知识-day9(库学习)
1.os学习 1 print(os.name) #获取操作系统 2 print(os.path.exists("D:\soft\python")) #判断路径是否存在 3 prin ...
- 一文掌握GitHub Actions基本概念与配置
CI/CD包含很多流程,如拉取代码.测试.构建打包.登录远程服务器.部署发布等等. 而Github Actions是GitHub推出的一个CI/CD工具,类似工具还有TravisCI.Jenkins等 ...
- centos 7搭建svn+apache及权限控制
SVN服务器运行模式: 模式1:svn服务器单独运行 监听: 3690端口 访问: svn://IP 模式2: svn 服务器+ apache : 80 端口 访问: http://IP 1. #安装 ...
- openGauss内核:SQL解析过程分析
摘要:在传统数据库中SQL引擎一般指对用户输入的SQL语句进行解析.优化的软件模块.SQL的解析过程主要分为:词法.语法和语义分析. 本文分享自华为云社区< openGauss内核分析(三):S ...
- 通过Go语言创建CA与签发证书
本篇文章中,将描述如何使用go创建CA,并使用CA签署证书.在使用openssl创建证书时,遵循的步骤是 创建秘钥 > 创建CA > 生成要颁发证书的秘钥 > 使用CA签发证书.这种 ...
- linux firewall (marker)
查看防火墙是否开启systemctl status firewalld 若没有开启则是开启状态systemctl start firewalld 关闭则start改为stop 查看所有开启的端口fi ...
- Re:用webpack从零开始的vue-cli搭建'生活'
有了vue-cli的帮助,我们创建vue的项目非常的方便,使用vue create然后选择些需要的配置项就能自动帮我们创建配置好的webpack项目脚手架了,实在是'居家旅行'必备良药.这次借着学习w ...
- 创建私有CA,我就用openSSL
目录 简介 搭建root CA 生成root CA 使用CRL 使用OSCP 总结 简介 一般情况下我们使用的证书都是由第三方权威机构来颁发的,如果我们有一个新的https网站,我们需要申请一个世界范 ...
- CF1706A Another String Minimization Problem 题解
题意 给定一个长度为 \(n\) 的序列 \(a\) 以及一个长度为 \(m\) 的字符串 \(s\),初始 \(s\) 均为 \(\text{B}\),第 \(i\) 次操作可以把 \(s_{a_i ...