自学内容网 自学内容网

跟我学C++中级篇——优化的整体分析

一、软件的优化

对于软件优化来说,已经是老生常谈。这里开门见山,说一句最核心的:“不要急于优化”。要把优化当成一种渐进的过程,在时机到达时,再展开优化。而且正常情况下,优化一定是一个从点到面的过程,而不是暴风骤雨的革命式的优化。那不叫优化,那叫重构或者重写。当然,从更宏观的角度看,二者也算是一种优化。
在前面的文章的优化的一系列文章中,从各个角度对优化进行过分析(如“c++应用程序优化系列”)。这些文章更多的是聚焦于具体的某个业务层次进行了优化的阐述,今天这篇文章则从整体上对优化进行一次分析说明。
大家需要注意的是,所谓的软件优化,不单纯指开发者看到的效率或者执行速度的提升。其广泛的包括:效率、质量、可扩展性、成本、可维护性以及其它种种能够降低软件开发难度提高软件整个生命周期的成本的工作。

二、优化整体分类

软件优化有很多种,可以从不同的角度来划分。这里将软件优化分为以下几种比较典型的方面:
1、设计优化
设计优化,有些类似于工程优化。好的设计,可能会更灵活更高效。比如引入一些设计模式或者新的设计思想,让整个程序分层更清晰,代码更优雅。提高了程序的可阅读性和可维护性,扩展性也大大增强。这就是设计优化的目的。
想要有一个良好的设计,除了丰富的经验外,不断的提高设计者的设计思想水平,才是根本。所以优化软件,首先要设计者本身优化。
2、编译优化
指的是使用更好的编译器而不是在代码层次针对编译器进行优化。简单说来,就是前面提到的,好的编译器会自动对一些代码进行优化,提高效率并预防出现一些低级的问题。
3、代码优化
最常见的优化,其实大多指的就是代码的优化。它更倾向于把代码写得更简洁、效率更高,更容易排除一些BUG。比如在C++中引入RAII,引入一些编程技巧等,诸如此类。可以让程序的代码执行效率更高或者更安全。
但这里有一点需要注意,很多优化者把这项优化追求到了极致,优化的代码往往非一般开发者能够三五眼看明白的。所以说,这种极致优化,其实是一种特定场景的优化。大家不要陷入这种极致的思想不能自拔,处处要榨干代码的能力。最合适的才是最好的。
4、算法优化
算法优化可能是代码优化外的一种更为人们易于接受的优化方式。这个非常好理解,牛车就是不如汽车跑得快。排序算法里,冒泡排序一般不如快排等效率高。如果涉及到一些更专业的算法,可能算法的优化或者提高,对产品的影响是革命性的。
5、框架(库)优化
在很多开发者的眼中,可能一个非常有名的框架或者库甚至是一些所谓的标准库,都是非常高效的,勿需调优。从一般的情况来讲,确实如此。但在实际应用中也有一些问题,首先,无论多么有名气的框架库,都是人开发的,必然会引入BUG。其次,即使在库的应用中,也存在着一些禁忌或者说未想到的特殊情况。举一个不恰当的例子,某OS被一几岁的小女孩不断的乱敲击键盘不用输入密码就进去了。最后,库的针对性是宽泛的,所以可能会出现在一些情况下的性能瓶颈。
当然,越是现代的框架或库,对这些问题都处理的更严谨更安全。这种概率在不断的降低,但再降低也无法杜绝。这就是开发者在某些情况下可以展开优化的根本原因。
6、内存优化
内存优化是几乎所有开发者都能想到的,也亲自经历过的。哪怕是不是自己亲自下手也是“没吃过猪肉也见过猪跑”。内存的问题也是几乎所有语言都无法回避的一个根本性的问题,可以不负责任的说,大多说的BUG,基本都或多或少的和内存的管理有关。
内存优化不管是对提高运行效率,降低运行成本都是一个非常重要的环节。据说某大商城让优化内存,能减少五分之一的应用,就奖励以十万计的奖金。
7、并发(行)优化
这类优化,重点就是针对效率来进行的。说白了,就是提高运行速度和处理速度。更明白一点,粗暴的可以认为,原来需要十分钟处理完成的作业,现在十秒就OK了。
8、硬件优化:根据具体的场景,发挥硬件的最大效果而不是让其在整体最优。这句话可能不太好理解,这里解释一下,一般来说,对CPU和GPU可能为了兼顾各个方面,会在工作时无法进行最大能力的运行。但如果在开发时,可以肯定应用场景就是硬件某个特点的最大应用,则可以解除硬件相关的限制,用硬件的最大的能力来解决这种场景问题。
这样说可能还是不好理解,举个例子,开发一个程序,一般情况就是考虑在CPU上运行。但是如果确定这个程序主要就是进行密集的数据并行计算(如图像处理或深度学习等),那么就要考虑GPU的程序开发,或者说使用一些GPU的框架。这也是为什么大型音视频公司和AI公司,疯狂堆积显卡的原因。

在分析完成上面的优化种类后,回头再看,它们这些优化动作有很多是穿插交融在一起的,不是说靠一个来解决优化的问题的。开发者既可以降低内存的需求,又可以提高并行的效率,又可以优化硬件等等。甚至还可以有其它的手段来完成优化,比如涉及到社会工程学的技术,不过那不属于讨论的范畴了。

三、优化的过程

软件的优化需要一个过程,不是说想优化就优化的。大家都有这样的经验,可能只是改动了很少的一部分代码,结果整个项目无法运行了。或者说,局部最优未必是整体最优,这也是在优化时需要考虑的一个重要问题。
比如一个生产者和消费者系统,单纯的优化任何一个,优化的越明显,可能整个系统的瓶颈越明显,甚至无法工作。
因此,进行优化的过程需要注意以下几点:
1、要遵循软件设计的原则
在完善自己的代码时还好一些,尤其在完善框架库或者别人的代码时,尽量符合开闭原则,尽量不要直接优化别人的代码。
2、要减少中间环节
软件设计中,中间层能处理很多问题。但不能滥用中间层,所以在优化时,应尽量将无效的中间层优化掉,特别是在一些效率优先的环节,更是如此。减少的中间调用链路越多,理论上讲效率会越高。不过在这其中,就有一个平衡设计和提高效率的平衡点。
3、逐步推进
优化要从一点一滴开始,不要想一上来就优化多么大的一块。这个不太现实,整不好,就把项目给优化掉了。
4、善于借助工具
优化不能光靠自己的想法和别人的建议,要会用一些优秀的工具,比如优化内存时可以用一些动态静态相关的内存分析工具,这样可以事半功倍。而对于多线程可以用一些扫描工具,看看哪个线程是瓶颈等等。
5、有计划的采用新技术和新框架等
这个就不用罗列了,新技术和新框架库等,本身就是一种很大的进步,这就需要优化者要不断的学习并打开眼界。

四、总结

再次提醒,不要轻易展开优化。特别是对于一些中小公司的开发者来说,不要迫切的想优化你的项目。可能开发者的优化并不是设计者想优化的目的。同样,技术人员的优化可能并不是市场人员的优化的目标。
说来归去,实事求是的根据实际需求进行优化。盲目的优化,有可能会让你盲目。


原文地址:https://blog.csdn.net/fpcc/article/details/143063162

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!