分类: C/C++
2015-05-16 20:16:23
原文地址:C++编程小记 作者:steven_miao
在一些对于时间要求比较严苛的情况下,而在算法无法改进的情况下可以改变语言的实现方法来加速算法实现。
1. 双循环变为单循环
在图像处理中,很多情况下会出现如下code:
For(int i=0;i
For(int
j=0;j
}
}
在上述的循环中需要计算两次乘法和两次加法,而改为下述的形式则可以加速
;i++){
[i] = m_pSrc[i];
}
上述code中Height*Width,建议采用如下code
For(long i=0;i
M_pBuffer[i] = m_pSrc[i];
}
2. 类成员引用
在C++开发中,经常会采用class 将数据打包起来,这样从程序的可理解程度上来看是增加了程序的可读性,不过却增加了运行时间,以下列code为例:
Class {
Public:
CDevice(){};
Virtual ~ CDevice(){};
BYTE *m_pBuffer;
BYTE *m_pSrc;
;
BYTE m_btMin;
Protected:
Private:
};
CDevice m_device;
For(long i=0;i
m_device.m_pBuffer[i] = m_device.m_pSrc[i];
}
在编译器编译时上述code会增加两条指令,即到m_device中索引上述成员,会增加时间,特别在lSize比较大时。建议采用如下code
= m_device.m_pBuffer;
BYTE * = m_device.m_pSrc;
Long lSize = Height*Width;
For(long i=0;i
m_Buffer [i] = m_Src[i];
}
3. 比较
在某些情况下,需要对参数比较如:
BYTE *m_Buffer= m_device.m_pBuffer;
BYTE *m_Src = m_device.m_pSrc;
Long lSize = Height*Width;
For(long i=0;i
If((m_Src[i] >= m_device.m_btMin) && (m_Src[i] < m_device.)){
m_Buffer [i] = ;
}
}
上述code的是能够实现所需的功能,不过会损耗部分时间在寻址上,建议如下code
BYTE *m_Buffer= m_device.m_pBuffer;
BYTE *m_Src = m_device.m_pSrc;
Long lSize = Height*Width;
BYTE max = m_device.m_btMax;
BYTE min = m_deivce. m_device.m_btMin;
BYTE ;
For(long i=0;i
= m_Src[i];
If((Value >= min) && (Value < max)){
m_Buffer [i] = Value;
}
}
如果上述的max和min是固定值建议将其替换为固定值,减少寻址时间,如max为146,
Min为89,则code如下:
BYTE *m_Buffer= m_device.m_pBuffer;
BYTE * = m_device.m_pSrc;
Long lSize = Height*Width;
BYTE max = m_device.m_btMax;
BYTE min = m_deivce. m_device.m_btMin;
BYTE Value;
For(long i=0;i
Value = m_Src[i];
If((Value >= 89) && (Value < 146)){
m_Buffer [i] = Value;
}
}
上述code在可读性上会下降,不过在核心的算法中可以采用上述手段。
通过上述的不同的code编写,其实现的时间是不同的,我实现一算法中,通过上述改变,算法实现时间提高了40%~60%。
4. 绝对值
在一些算法中绝对值运算很多,一般均采用系统自带的abs函数来实现。不过在某些情况下可以采用如下code,前提数据类型为long int char这几种类型,不包含float以及double:
Int nValue = k1-k2;
if(&0x80000000){
nValue = ~nValue+1;
}
5. 指针索引
在一些算法中会计算其后三个连续值的平均值,如:
Int nValue = (m_Src[i]+ m_Src[i+1]+ m_Src[i+2])/3;
}
上述code可以通过下述程序来代替
BYTE X,Y,Z;
For(long i=0;i
);
Y = *(m_Src++);
Z = *(m_Src++);
Int nValue = (X+Y+Z)/3;
}
不过上述的code对于提高性能有限.