c语言编程:C语言高效编程的几招来源: 发布时间:星期三, 2008年12月10日 浏览:2次 评论:0
引 言:
编写高效简洁C语言代码是许多软件工程师追求目标本文就工作中些体会和经验做相关阐述不对地方请各位指教 第1招:以空间换时间 计算机中最大矛盾是空间和时间矛盾那么从这个角度出发逆向思维来考虑效率问题我们就有了解决问题第1招——以空间换时间 例如:串赋值 方法A通常办法: # LEN 32 char 1 [LEN]; mem (1,0,LEN); strcpy (1,“This is a example!!”); 方法B: const char 2[LEN] =“This is a example!”; char * cp; cp = 2 ; (使用时候可以直接用指针来操作) 从上面例子可以看出A 和B效率是不能比在同样存储空间下B直接使用指针就可以操作了而A需要两个才能完成B缺点在于灵活性没有A好在需要频繁更改个串内容时候A具有更好灵活性;如果采用方法B则需要预存许多串虽然占用了大量内存但是获得了执行高效率 如果系统实时性要求很高内存还有些那我推荐你使用该招数 该招数变招——使用宏而不是举例如下: 方法C: # bwMCDR2_ADDRESS 4 # bsMCDR2_ADDRESS 17 BIT_MASK( __bf) { ((1U << (bw ## __bf)) - 1) << (bs ## __bf); } void SET_BITS( __dst, __bf, __val) { __dst = ((__dst) & ~(BIT_MASK(__bf))) | \ (((__val) << (bs ## __bf)) & (BIT_MASK(__bf)))) } SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber); 方法D: # bwMCDR2_ADDRESS 4 # bsMCDR2_ADDRESS 17 # bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS) # BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf)) # SET_BITS(__dst, __bf, __val) \ ((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | \ (((__val) << (bs ## __bf)) & (BIT_MASK(__bf)))) SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber); 和宏区别就在于宏占用了大量空间而占用了时间大家要知道是是要使用系统栈来保存数据如果编译器里有栈检查选项般在头会嵌入些汇编语句对当前栈进行检查;同时CPU也要在时保存和恢复当前现场进行压栈和弹栈操作所以需要些CPU时间而宏不存在这个问题宏仅仅作为预先写好代码嵌入到当前不会产生所以仅仅是占用了空间在频繁同个宏时候该现象尤其突出 D方法是我看到最好置位操作是ARM公司源码部分在短短三行内实现了很多功能几乎涵盖了所有位操作功能C方法是其变体其中滋味还需大家仔细体会 第2招:数学方法解决问题 现在我们演绎高效C语言编写第二招——采用数学方法来解决问题 数学是计算机之母没有数学依据和基础就没有计算机发展所以在编写时候采用些数学方法会对执行效率有数量级提高 举例如下求 1~100和 方法E I , j; for (I = 1 ;I<=100; I ) { j I; } 方法F I; I = (100 * (1+100)) / 2 这个例子是我印象最深个数学用例是我计算机启蒙老师考我当时我只有小学三年级可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题方法E循环了100次才解决问题也就是说最少用了100个赋值100个判断200个加法(I和j);而方法F仅仅用了1个加法1 次乘法1次除法效果自然不言而喻所以现在我在编时候更多是动脑筋找规律最大限度地发挥数学威力来提高运行效率 第3招:使用位操作 实现高效C语言编写第三招——使用位操作减少除法和取模运算 在计算机中数据位是可以操作最小数据单位理论上可以用“位运算”来完成所有运算和操作般位操作是用来控制硬件或者做数据变换使用但是灵活位操作可以有效地提高运行效率举例如下: 方法G I,J; I = 257 /8; J = 456 % 32; 方法H I,J; I = 257 >>3; J = 456 - (456 >> 4 << 4); 在字面上好像H 比G麻烦了好多但是仔细查看产生汇编代码就会明白方法G了基本取模和除法既有还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关汇编代码更简洁效率更高当然由于编译器不同可能效率差距不大但是以我目前遇到MS C ,ARM C 来看效率差距还是不小相关汇编代码就不在这里列举了 运用这招需要注意是CPU不同而产生问题比如说在PC上用这招编写并在PC上调试通过在移植到个16位机平台上时候可能会产生代码隐患所以只有在定技术进阶基础下才可以使用这招 第4招:汇编嵌入 高效C语言编程必杀技第四招——嵌入汇编 “在熟悉汇编语言人眼里C语言编写都是垃圾”这种说法虽然偏激了些但是却有它道理汇编语言是效率最高计算机语言但是不可能靠着它来写个操作系统吧?所以为了获得高效率我们只好采用变通方法 ——嵌入汇编混合编程 举例如下将赋值给二,要求每字节都相符 char 1[1024],2[1024]; 方法I I; for (I =0 ;I<1024;I) *(2 + I) = *(1 + I) 方法J #def _PC_ I; for (I =0 ;I<1024;I) *(2 + I) = *(1 + I); # #def _ARM_ __asm { MOV R0,1 MOV R1,2 MOV R2,#0 loop: LDMIA R0!, [R3-R11] STMIA R1!, [R3-R11] ADD R2,R2,#8 CMP R2, #400 BNE loop } #end 方法I 是最常见方法使用了1024次循环;方法J则根据平台不同做了区分在ARM平台下用嵌入汇编仅用128次循环就完成了同样操作这里有朋友会说为什么不用标准内存拷贝呢?这是在源数据里可能含有数据为0字节这样话标准库会提前结束而不会完成我们要求操作这个例程典型应用于LCD数据拷贝过程根据不同CPU熟练使用相应嵌入汇编可以大大提高执行效率 虽然是必杀技但是如果轻易使用会付出惨重代价这是使用了嵌入汇编便限制了可移植性使在不同平台移植过程中卧虎藏龙险象环生!同时该招数也与现代软件工程思想相违背只有在迫不得已情况下才可以采用切记切记 使用C语言进行高效率编程我体会仅此而已在此以本文抛砖引玉还请各位高手共同切磋希望各位能给出更好方法大家起提高我们编程技巧 0
相关文章
读者评论
发表评论 |