![32586810257f4d4a31f1aa83cd112e2c.png](https://i-blog.csdnimg.cn/blog_migrate/c434f2dcabd61dcd7f17102b82032cfd.jpeg)
记录一下个人在学习C++过程中学习到的小技巧,有些小问题对计算效率的影响真的很大,个人也没有经过专业的编程学习,总发现自己的程序在效率上跟商业软件甚至其他开源程序差距太大,因此把一些小技巧总结一下,跟大家分享。
PS:所有程序在visual studio编译器的O2优化条件下编译
1、内存读取
- CFD网格里面场量进行处理的时候,尽量按照存储的顺序对进行读取,不然同样的程序效率差距会非常大,具体看看下面对数组
、
跟二维数组
的处理,首先申请内存空间:
#define MAX (2E4)
float *a,*b,**c;
a = new float[MAX];
b = new float[MAX];
c = new float *[MAX];
for (size_t i = 0; i < MAX; i++)
{
a[i] = i;
}
for (size_t i = 0; i < MAX; i++)
{
b[i] = i;
}
for (size_t i = 0; i < MAX; i++)
{
c[i] = new float[MAX];
}
假设有
for (size_t i = 0; i < MAX; i++)
{
for (size_t j = 0; j < MAX; j++)
{
c[i][j] = a[i] * b[j];
}
}
读取系统运行时间为0.5s。如果不按照内存存储顺序进行处理如下面代码所示:
for (size_t i = 0; i < MAX; i++)
{
for (size_t j = 0; j < MAX; j++)
{
c[j][i] = a[i] * b[j];
}
}
系统运行时间高达5.9s。是正常读取时间的10倍还要多。
2、标准库的使用
理论上说标准库应该效率不差,但是我个人在使用过程中,还是发现效率还是低了一点,还是实现上面的逻辑,在定义时使用下面这段代码
std::vector<float> a(MAX),b(MAX);
std::vector<std::vector<float>> c(MAX);
for (int i = 0; i < MAX; i++)
{
c[i].resize(MAX);
}
其他部分都一样,最后系统运行时间为0.8s,比使用原始动态数组方法慢一半,当然代码简洁了很多,到底该不该用呢?当然有一定肯定的,千万别不初始化大小,使用push_back填满数组,效率差很多,代码如下:
std::vector<float> a(MAX),b(MAX);
std::vector<std::vector<float>> c(MAX);
for (size_t i = 0; i < MAX; i++)
{
a[i] = i;
}
for (size_t i = 0; i < MAX; i++)
{
b[i] = i;
}
for (size_t i = 0; i < MAX; i++)
{
for (size_t j = 0; j < MAX; j++)
{
c[i].push_back(a[i] * b[j]);
}
}
系统运行时间1.74s,比原先慢了1倍的时间,随着数组大小MAX增大,慢的还更多,对于CFD网格动辄上千万的的网格,没有必要使用push_back,而且所有的网格文件都定义了数组的大小,直接初始化就完事了。