记录一次图像编程优化作业的收获(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;
}