找回密码
 立即注册
查看: 266|回复: 2

代码优化

[复制链接]
发表于 2022-12-10 10:13 | 显示全部楼层 |阅读模式
1、 两个for循环,要把小循环放外层,大循环放内层,这样可以减少两个循环之间的跨切次数
【不好的写法】
for (int i = 0; i < 10000; i++)
    for (int j = 0; j < 10; j++)【优化】
   for (int i = 0; i < 10; i++)
    for (int j = 0; j < 10000; j++)2、减少没必要的打印,这个很耗内存。比如sprintf、printf都是很耗内存的,包括断言
3、用移位操作代替乘法和除法。比如A乘以2,可以直接把A左移一位 A << 1;A / 8可以写成A右移3位 A >> 3。因为在计算机程序中数据的位是可以操作的最小数据单位,灵活的位操作可以有效地提高程序运行的效率
4、循环语句中不要增加运算表达式,要提取出来,避免每次循环过程中都要进行一次运算
【不好的写法】
int a, b, val;
while (a * b < val) {...}【优化】
int a, b, val;
int result = a * b;
while (result < val) {...}5、for (;;)的汇编指令少,比while(1)要好一点点
6、尽量使用宏和内联函数:在 C程序中宏代码本身不是函数,虽然使用起来有点像函数。函数调用要使用系统的栈来保存数据,CPU 在函数调用时需要保存和恢复当时的现场,要进行进栈和出栈操作,所以函数调用需要耗CPU时间。而宏定义就没有这个问题,宏定义仅仅作为预先写好的代码嵌入到当前程序中,不产生函数调用,所占用的仅仅是一些空间,省去了参数压栈,直接返回参数执行,从而提高了程序的执行速度。比如最常用两个数比较,这些都可以直接定义成宏,而且这样代码也直观,可读性强。内联函数也是相同道理,只在本文件中被调用,减少从其他文件导入调用的时间
#define  MAX2(a, b)  (((a) >= (b)) ? (a) : (b))
#define  MIN2(a, b)  (((a) >= (b)) ? (b) : (a))
#define  MAX3(a, b, c)  MAX2(MAX2(a, b), MAX2(b, c))
#define  MIN3(a, b, c)  MIN2(MIN2(a, b), MIN2(b, c))7、减少浮点数的计算,或者尽量避免。能用char型就不要用int型,能用int型就不要用long型,float型能尽量不用就不要用
8、循环范围内不要嵌套太多if判断条件,最好不要超过2层
【不好的写法】
for (int i = 0; i < 255; i++)
    if (...)
        if (...)
        else if (...)9、switch的case很多时,为了减少比较的次数,可以把发生频率相对高的条件放在第一位
10、尽量不要使用递归。递归看起来很牛逼,代码看上去也很节俭,但如果重复调用嵌套次数很多时,是很耗时间的,效率很低,而且递归条件一不小心没有设置好,就容易产生死循环,所以个人建议还是尽量少用。条条大路通罗马,程序实现有多种优化算法,不是非一定要使用某一种设计,要灵活点。
11、for循环中的控制变量,尽量用int型,不要用byte型。如 for (int i = 0; i < n; i++)
       别小看上面这几条小技巧,当高峰期接入很多用户时,程序运行效率会很低甚至崩溃,以上代码优化的技巧哪怕只修改一两个点,就很可能会大大的降低cpuload。这是笔者多年来定位cpuload问题经历过的,所以平时我们在写代码过程中,一定要养成良好的习惯,并且定期代码走查。有时通宵熬夜定位某个问题几天几夜,最终可能就只改一行代码就ok了。这种cpuload优化提高程序效率,就是很典型的一个例子之一。
       另外,再说下代码走查,代码走查是发现bug的最有效途径之一,也是最廉价最实用的方法之一,我们应该重视,而且要长期执行,没有哪个编码人员敢说他的代码永远都没有bug。我们组织代码走查,比如团队与团队之间,团队内部的各模块之间的人员,大家互相走查,发现有效问题可以作为奖励或平时的考核业绩,这一项活动要长期进行,让开发人员养成良好的习惯。我们要相信团队的力量,相信科学,因为每个人的思维和能力是不一样的,相同的一篇文章每个人看后可能都有不同的理解,代码也是一样的道理,头脑风暴,就可能会发现异常之处,甚至可以提出各种优化的途径,取长补短,才能使代码质量更上一层楼。同时工作过程中,随着个人的业务能力和定位问题能力的不断提升,思维会逐渐开阔,通过代码走查发现bug的机会也会随之增长,不要测试通过了就再也不回头走查曾经的代码。
发表于 2022-12-10 10:21 | 显示全部楼层
第一次看到建议别人多用宏的[惊喜]
发表于 2022-12-10 10:22 | 显示全部楼层
switch都有很多case了,编译器不会优化成if else形式,命中频率高的前面和后面也没啥关系了
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-15 22:36 , Processed in 0.091026 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表