首页 > 编程语言 >C++ 性能小测 1 二维数组的遍历效率

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

时间:2022-08-28 19:22:13浏览次数:59  
标签:遍历 小测 int C++ rowSize 二维 数组 columnSize

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
请按任意键继续. . .

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

标签:遍历,小测,int,C++,rowSize,二维,数组,columnSize
From: https://www.cnblogs.com/young520/p/16633440.html

相关文章

  • C++一些新的特性的理解(二)
    1C++11多线程thread重点:join和detach的使用场景thread构造函数参数绑定c函数绑定类函数线程封装基础类互斥锁mutexconditionnotify、waitlock_guard/unique_l......
  • C++【多线程编程】之【初识线程】
    1.用c++11的thread库还是用pthread库?至于选择哪种多线程编程方案,需要根据你的实际项目、运行平台、团队协作等因素来考虑。一般而言,如果使用的是Linux操作系统,那么可以......
  • Google C++ Style Guide 学习
    目录参考参考http://home.ustc.edu.cn/~hqp/RootClass/AddFiles2/GoogleC++StyleGuide.pdfhttps://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styl......
  • 【C++-笔记】override与final说明符
    在effectiveC++中提到C++没有Java那样的finalclasses的禁止派生的机制,遂想到在C++Primer中好像提到过final说明符,正好就连带着override说明符一起复习一下了。简介首......
  • C++ 用函数打印员工的平均工资
    #include<iostream>#include<windows.h>#include<string>usingnamespacestd;floataverageSalary(intn[],inti){floatsum=0;for(intx=0;x......
  • 线段树 C++实现 树形式
    网上看了一圈,看到几个都是用数组实现的我用树结构重写了一遍#ifndefSEGMENTTREE_H#defineSEGMENTTREE_H#include<vector>template<typenameT>classSegmentTree......
  • c++ :虚拟机centos7+vscode
    c++:虚拟机centos7+vscodegcc、g++、make查看是否安装成功$gcc--version$g++--version$make--version哪个没有,就yuminstallgcc-c++/yuminstallgcc/yum......
  • 6.7 列表的判断和遍历
    # for in# not in# in列表的判断in和notinlst=[10,56,98,100]print(10inlst)#10是在列表里吗print(10notinlst)#10不在列表里......
  • c++ delegate 类,最大16个参数,用程序生成的代码
    2017-02-1604:58:34 发布于 CSDN 现转博客园。 读这篇文章的前提是,我们使用的编辑器对c++11的支持不太友好。下面是测试代码:#include<stdio.h>#include<stdlib......
  • C++函数名称作为参数
    1#ifndefCHANPROJECT_VECTOR2D_H2#defineCHANPROJECT_VECTOR2D_H3#include"ChanGlobal.h"45namespaceCommon{6template<typenameT>7cl......