1987WEB视界-分享互联网热点话题和事件

您现在的位置是:首页 > WEB开发 > 正文

WEB开发

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

1987web2024-03-26WEB开发36
遍历二维数组时,常规思路是使用一个嵌套循环。一方面,由于CPU使用了分支预测技术,因此通常将循环次数最多循环的放在最内层。另一方面,由于二维数组是按行存储的,因此遍历二

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

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

#include#includeusingnamespacestd;constintrowSize=50000;constintcolumnSize=2000;constinttestCount=100;intmain(){//生成大型二维数组int**arr=newint*[rowSize];for(inti=0;i<rowSize;i++){arr[i]=newint[columnSize];for(intj=0;j<columnSize;j++){arr[i][j]=rand()%5;}}//声明工具变量doublemeanTime=0;longdoublesum=0;clock_tstart,end,time;//将列循环放在内层,进行多次测试time=0;for(intk=0;k<testCount;++k){sum=0;start=clock();for(inti=0;i<rowSize;++i){for(intj=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(intk=0;k<testCount;++k){sum=0;start=clock();for(intj=0;j<columnSize;++j){for(inti=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(inti=0;i<rowSize;i++)delete[]arr[i];delete[]arr;system("pause");return0;}

测试输出如下:

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

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

声明:本站所有文章,如无特殊说明或标注,均为爬虫抓取以及网友投稿,版权归原作者所有。