图像编程优化

记录一次图像编程优化作业的收获(C/C++)

优化一段程序,我个人总结为:
1.结构优化(赘余+底层)
2.算法优化
3.多线程

结构优化

赘余
尽量减少运算次数,尤其是在循环体内部。常用的有时空互换LUT(查表),对称

在范围允许的情况下,定义变量类型的优先级如下 unsigned char> int>double,至于float类型在C++业界圣经中建议用double替代(运算也可能更快,精度损失少)。
底层

索引换成指针;

多维数组化一维;

移位异或替代四则运算,加or乘的舍取(许多CPU采用Booth的乘法,运算速度快于加法);

巧用指令流水线(实例:去掉内层循环,将循环体展开,让多条语句(不能过多。否则cache命中率极具下降)排列在一起,可达到并行的目的);

尽可能削减赋值操作(用指令流水线可能会增加额外的赋值操作,请注意平衡!);

定义少许简单的函数可加快运算;

保证cache高速缓存高命中率,建议让程序访问连续的内存(实例:最内层循环次数应是最大的,图片处理,当宽比高的值大的时候,宽作为最内层循环,程序可以访问连续的内存)。

算法优化

算法和思想是基本功也是极其重要的一块就不多说了:降维思想、分治思想、动态规划思想、搜索、排序等等,多多积累

多线程

将图片分成若干块,多线程并发运行,优化效果惊人,我由原来的单线程到开了4个线程,程序快了1到2倍。

#include <windows.h>
DWORD WINAPI Fun(LPVOID lpParamter)
{	
}
int main(){
//window推荐 _beginthread(),因为使用CreateThread()创建的线程里面,涉及CRT(C RUNTIME LIBRARY)的函数会有由多个线程访问修改导致的数据覆盖问题。
	 HANDLE hThread1=CreateThread(NULL, 0, Fun, NULL, 0, NULL);
	 WaitForSingleObject(hThread1, INFINITE);//等待信号量>0
	 CloseHandle(hThread1);
	 
	 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值