概述
最近楼主在做气动声学计算时,需要用到多维vector。为了后面的变量运算方便,打算将vector最里面的vector的size大小设为4(因为计算量有4个(rho,u,v,p))。所以vector的大小为: [x_points][y_points][4] 。当这样做好后,发现运算比原来 [4][x_points][y_points] 慢了很多。后来,为了矩阵运算,将4个变量设置成struct的形式,速度快了不少,并且内存占比也不一样。记录如下:
#include <ctime>
#include <vector>
#include <iostream>
struct A
{
/* data */
double a;
double b;
double c;
double d;
A() : a(0.0), b(0.0), c(0.0), d(0.0) {}
A(double a1, double b1, double c1, double d1) : a(a1),
b(b1), c(c1), d(d1) {}
};
int main()
{
A a;
//std::vector<std::vector<A>> dvec0;
std::vector<std::vector<std::vector<double>>> dvec1;
std::vector<std::vector<std::vector<double>>> dvec2;
int size = 5000;
std::clock_t start, end;
start = std::clock();
////案例dvec0,大小为[5000][5000][A],共25,000,000*A共一亿个double数据
//dvec0.resize(size);
// for (int i = 0; i < size;++i)
// dvec0[i].resize(size);
////案例dvec1,大小为[5000][5000][4],共25,000,000*4共一亿个double数据
//dvec1.resize(size);
//for (std::vector<std::vector<double>>::size_type i = 0; i < size; ++i)
//{
// dvec1[i].resize(size);
// for (std::vector<double>::size_type j = 0; j < size; ++j)
// dvec1[i][j].resize(4);
//}
////案例dvec2,大小为[4][5000][5000],共4*25,000,000共一亿个double数据
//dvec2.resize(4);
//for (std::vector<std::vector<double>>::size_type i = 0; i < 4; ++i)
//{
// dvec2[i].resize(size);
// for (std::vector<double>::size_type j = 0; j < size; ++j)
// dvec2[i][j].resize(size);
//}
//案例4 dvec0,直接初始化
std::vector<std::vector<A>>dvec0(size, std::vector<A>(size, a));
end = std::clock();
double time_dura = double(end - start);
std::cout << time_dura << std::endl;
std::system("pause");
return 0;
}
案例1 :dvec0[5000][5000][A]
利用将4个变量设计成一个结构体A,然后用作为一个2维vector的元素。用时如下:
用时1.83s,内存760MB。
案例2 :dvec1[5000][5000][4]
直接将变量作为一个4个元素的vector,其内存和耗时如下:
用时28s,内存6GB
案例3 :dvec2[4][5000][5000]
将大vector放里面,其内存和耗时如下:
利用大数在内的原则,用时0.242ms,内存350MB。
案例4: dvec0[5000][5000][A]直接初始化vector
利用vector的直接初始化方法
用时:2.258s,内存839MB
结论
- [5000][5000][A]:用时1.83s,内存760MB;
- [5000][5000][4]:用时28.0s,内存6GB;
- [4][5000][5000]:用时0.24s,内存350MB;
- [5000][5000][A]: 用时2.258s,内存839MB.
- 用大数组在内的vector最快,内存占用最少,但是不利于后面运算;利用3维的vector形式最慢,且占用内存最高;利用结构体形式的二维vector占用内存较少,用时较少,且易于后面计算,可以选则;
- 直接初始化不如resize速度快.
--记于大雨后的夜- 人人生而平凡-2020.06.15