遍歷二維陣列時,常規思路是使用一個嵌套回圈,一方面,由于 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
請按任意鍵繼續. . .
由此可得:使用嵌套回圈遍歷二維陣列時,將列回圈放在內層運行效率更高,即使所遍歷的二維陣列行數遠大于列數,
本文作者:木三百川
本文鏈接:https://www.cnblogs.com/young520/p/16633440.html
著作權宣告:本文系博主原創文章,著作權歸作者所有,商業轉載請聯系作者獲得授權,非商業轉載請附上出處鏈接,遵循署名-非商業性使用-相同方式共享 4.0 國際版 (CC BY-NC-SA 4.0)著作權協議,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502981.html
標籤:其他
上一篇:cpu詳解
下一篇:第5章 回圈和運算式
