如何判断一维数组中是否存在一定高度的波峰_CFD/C++编程中的一些小技巧

本文介绍了在C++编程中,针对CFD网格处理时提高内存读取效率的小技巧。避免非顺序读取数组,可以显著提升程序运行速度。同时,对比了标准库和自定义动态数组的使用,指出未初始化大小的push_back操作在处理大规模数据时效率低下,建议直接初始化数组以提高性能。
摘要由CSDN通过智能技术生成

32586810257f4d4a31f1aa83cd112e2c.png

记录一下个人在学习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];
}

假设有

,根据上面二维数组c[i][j]的申请顺序,对c[i][j]进行处理有:
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,而且所有的网格文件都定义了数组的大小,直接初始化就完事了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值