【发布时间】:2020-12-19 02:47:06
【问题描述】:
我只是想问在处理 2D 数组时,在性能和效率方面哪个更好,可能还有代码复杂性,因为我们需要为我们的小组项目制作一个矩阵库。
我在下面有一个代码(我认为这可能不是一个很好的例子,这就是为什么我的内存有限)
#include <iostream>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main(){
auto start = high_resolution_clock::now();
auto arr2d = new unsigned long long int[10000ul][10000ul];
int cnt = 1;
for(unsigned long long int i=0; i<10000ul; ++i){
for(unsigned long long int j=0; j<10000ul; ++j){
arr2d[i][j] = cnt;
cnt++;
}
}
auto stop = high_resolution_clock::now();
auto duration = duration_cast<microseconds>(stop-start);
cout<<duration.count()<<endl;
auto start1 = high_resolution_clock::now();
auto arr1d = new unsigned long long int[100000000ull];
int cnt1 = 1;
for(unsigned long long int i=0; i<10000ul; ++i){
for(unsigned long long int j=0; j<10000ul; ++j){
arr1d[(i*10000ul)+j] = cnt1;
cnt1++;
}
}
auto stop1 = high_resolution_clock::now();
auto duration1 = duration_cast<microseconds>(stop1-start1);
cout<<duration1.count()<<endl;
return 0;
}
它表明性能并没有那么大的差异?
谁能给我们一个建议并解释我们应该走哪条路线?
【问题讨论】:
-
表示大小不会改变,所以这是一个动态数组?
-
uhmmmm...好吧,所以我想静态和动态这个词与我的问题无关,那么我将编辑标题。
-
uhhhmm...是的,太累了,无法实现它。
-
这个问题没有单一的答案。具有多维数组的代码的相对性能(相对于以类似于使用二维数组的方式访问一维数组的元素)取决于对数组执行的操作(或访问和修改元素的模式)。对于通用代码——通常使用不同的访问模式来做事情,很难知道——这些操作有时可能适合一维数组,有时适合数组数组。如果循环访问所有元素(即使不是完全顺序),两种方式都没有太大区别
-
@himynameisjm - 我根本没有建议。这取决于作用于矩阵的算法的性质。对于(例如)矩阵求逆,有一些算法更容易针对一维表示进行优化(例如,端到端连续放置的行或列),但还有其他算法更适合二维数组(即明确表示为数组的数组)。还有一些稀疏矩阵表示不太适合一维或二维表示。当真正的答案是“视情况而定”时,您正在寻找一个通用的答案。