ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-08-28 19:31:21  阅读:151  来源: 互联网

标签:遍历 小测 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
来源: https://www.cnblogs.com/young520/p/16633440.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有