这是我在编写程序过程中总结出来的一些建议
1、在编码过程中,程序员应该尽可能地为编译器提供更多的信息,协助编译器更好地进行优化。程序员与编译器主要通过C语言关键字进行交流。以C标准库函数strcpy为例,它的原型为:char *strcpy(char *dst,const char *src ),而不是char *strcpy(char *dst, char *src )。虽然它们只是相差了一个const,但是在编译器看起来却相差甚远,如果使用const修饰src,表明src指向一个常量字符串,编译器可直接从寄存器或者告诉缓存中访问它们,而不必每次都要从存储器中读出它们的内容。这一不仅提高了执行速度,且编译器也可以捕获对src指向的字符串的修改。
2、手动优化:计算密集型优化,如:a、如果b>0并且b*c不会饱和,那么可以使用乘法代替除法,将(a/b)>c代替为a>(c*b) 。b、如果乘法运算中的乘数或者除法运算中的分母为2的倍数,那么可以使用移位操作代替乘法。c、加法要快于乘法的,(a+a+a)代替为a*3
3、尽可能少使用全局变量,由于全局变量的全局可见的,可以在多个地方对其进行修改,因此编译器不能再寄存器中缓存全局变量的值。这样,读或写全局变量时,都必须访问存储器以装载或存储它们,并且在访问全局变量时 ,为了保证其完整性必须确保操作是原子的,这又会增加开销
4、局部性原理,优秀的代码倾向于展示良好的局部性,它包含两个方面的含义,一,倾向于在极短时间间隔内,多次引用同一存储器,二,倾向于在极短时间间隔内,引用当前访问的数据项附近的数据项。比较一下下面2种方法来求二维数组的和。由于C语言以行优先顺序存储数组,因此行优先累加方法的局部性优于列优先累计方法
#define M 100
#define N 100
/*行优先累加方法*/
int sumarrayrows(int a[M][N])
{
int i,j,sum=0;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
sum+=a[i][j];
}
return sum;
}
/*列优先累加方法*/
int sumarraycols(int a[M][N])
{
int i,j,sum=0;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
sum+=a[i][j];
}
return sum;
}
我要赚赏金打赏帖 |
|
|---|---|
| OK1126B-S开发板下以导航按键控制云台/机械臂姿态调整被打赏¥29元 | |
| 【树莓派5】便携热成像仪被打赏¥36元 | |
| 【树莓派5】环境监测仪被打赏¥35元 | |
| OK1126B-S开发板下多时段语音提示型电子时钟被打赏¥27元 | |
| OK1126B-S开发板下函数构建及步进电机驱动控制被打赏¥25元 | |
| 【S32K3XX】LPI2C 参数配置说明被打赏¥20元 | |
| OK1126B-S开发板的脚本编程及应用设计被打赏¥27元 | |
| 5v升压8.4v两节锂电池充电芯片,针对同步和异步的IC测试被打赏¥35元 | |
| 【S32K3XX】S32DS LPI2C 配置失败问题解决被打赏¥22元 | |
| 【S32K3XX】FLASH 的 DID 保护机制被打赏¥19元 | |
我要赚赏金
