怎样对系统进行优化?

作为一名软件开发人员,我想对于怎样对系统进行优化这样的问题,迟早都会遇上的。在此简单记录一下自己的一点思考,如果有哪位大神飘过,有不对的或者不恰当的地方麻烦指正,对于您的任何高见还请补充,不吝赐教,谢谢[拱手]。

一个系统的良好高效运行涉及到许多方面。运行在怎样的硬件平台上、什么样的操作系统、用的什么语言、有没有使用一些现有的被证明优秀的框架(刚好和该系统某些模块匹配)或者设计模式,等等,这些方面对系统都是有影响的。

那么,如果你现在接手了一个系统的优化和维护任务,你该怎么来优化?以下是笔者的一点个人思考。

1.从代码架构方面考虑

对系统的架构和模块划分多进行梳理,比如自动驾驶领域许多公司要开发L4的自动驾驶系统肯定都会先研究一番这个行业内开源的autoware系统和Apollo系统。先了解清楚业内优秀的系统架构,对于自己的系统有很好的借鉴意义。看看人家的系统模块之间是怎么划分的,消息是怎么通信的,它们的系统又有哪些缺点?

在一个就是设计模式,软件开发中用好了设计模式可以达到事半功倍的效果。笔者记得过往的工作经历中用过最多的是工厂模式、单例模式和模板方法模式。其实设计模式一共有23种之多,选择合适的设计模式来进行系统代码实现不但让系统代码耦合性小,可读性也会增强。

2.从操作系统和使用的平台特性方面考虑

了解操作系统相关知识在编写代码种也有很大好处,类似于生产者-消费者这样的多线程经典问题,操作系统中有很详细的描述。再就是操作系统中提供的类似于共享内存这样高效的进程间通信方式,在对通信要求很严格的情况下要积极使用。其他的什么线程池、内存池等在需要频繁创建线程来处理、需要频繁申请内存的情况下都可以尝试使用……

平台特性方面,我能想到的就是比如用的什么开发板,重点了解开发板的一些优势特性来配合提升系统的性能。比如Nvidia的开发板,长处在于其显卡。

3.从代码(语言)层面考虑

语言层面,也许是一个程序员最容易优化的部分。笔者根据自己过往的一些经历,列举以下几点:

1)代码量要尽量精简

代码是需要人养的,更多的代码意味着需要更多的人来养。如果你听说过某个公司开发了一年项目,结果在新功能增加的情况下系统的总体代码却减少了,这是不是说明了以前系统中充斥着许多冗余的烂代码?对于系统中多余的代码、执行不到的分支判断代码就应该尽早去掉。过多冗余代码对于系统运行、对于维护系统的人来说都是一种负担。

2)尽可能多的去使用语言提供的一些可以提升性能的特性

这里以c++语言为例,比如c++11中提供的make_shared可以创建一个shared_ptr类型的智能指针,而且make_shared一次创建内存对象和对象控制块,比起用new创建两次来说提升了效率;比如c++11中的右值引用支撑起来的移动语义特性,避免了以前在调用拷贝构造函数的时候内存的申请和释放,现在直接调用移动构造函数;比如函数之间传参的时候,尽量传递指针或者引用;再比如双层循环的情况下,把循环次数少的放在外层,多的放在里层;比如对于频繁插入删除的操作就使用链表这样的数据结构,而要避免使用队列或者数组这样的数据结构;对于在编译阶段就可以确定的类型或者做的事情,就不要放到系统运行的时候去做,比如常量表达式比非常量表达式,常量表达式在编译阶段就可以计算出结果,这可以极大提高程序的执行效率,因为表达式只需要在编译阶段计算一次,节省了每次程序运行时都需要计算一次的时间。等等。

类似的还有很多,我们在编写代码或者想要优化一个已有的系统的时候,就可以从语言层面去优化一个个小点。

3)内存检查和优化

笔者以前做Android开发的时候,在项目开发完成了做压力测试的时候,发现占用内存一直在增长,后来发现了代码中对象相互持有的情况。这种情况下A中持有B对象,B中持有A对象,因为引用计数不能清零所以两边对象都释放不了,导致内存泄漏。解决这个问题的办法是使用弱引用。c++中有weak_ptr就是解决此类问题的,Java中也有对象的弱引用的使用。

一些资源比如文件、数据库、句柄等使用完后要记得释放。

============================================================

一点拙见,以后有新的想法再补充。

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值