一、代码调优的策略和过程
代码调优是修改正确的代码以实现更高效地运行。
调优通常是指小规模的改变
在代码层面调优之前,应首先考虑以下策略:
不要过分强调不需要的性能
高层的架构设计
更换数据类型或算法
是否由类库中隐藏的对OS的调用导致的问题
优化编译器
升级硬件
代码调优是最后的选择
程序优化的Pareto原则
20%的程序消耗了80%的执行时间
调优的目标就是找到20%的热点,并优化
完美是优良的敌人,努力做到完美,可能会妨碍软件的完成。先解决有无问题,再解决优劣问题。
代码调优并不是减少代码行、根据猜测进行优化、随时随地优化、优化排在第一位
(1)代码行数与效率
代码行数与程序的资源占用和运行速度之间没有必然的联系
(2)通过剖析和测量进行调优
性能分析有助于发现热点
性能分析为度量改进后的效果提供了基础
代码调优应基于精确地度量
每次调优都意味着需要重新性能分析
否则,在一种环境下的调优,在其他环境下有可能反而降低性能
(3)完成代码后再优化
忙于微观的优化,会导致忽略了全局的优化
完成开发之前,难以发现瓶颈
即使发现并纠正了瓶颈,也可能造成其他的瓶颈
早期关注优化,会忽略更重要的目标
(4)速度与正确性
显然正确是最重要的,只有很少的项目把性能摆在首位,对多数程序而言,早期优化会影响包括性能在内的整体质量
起始于书写良好的代码,只在最后进行调优
何时调优
使用高品质的设计
使程序正确
使其模块化,易于修改,以便以后轻松使用
完成并正确后,检查性能。 如果程序变细,请快速小巧
在需要之前不要进行优化
代码调优过程
使用精心设计的代码来开发软件,这些代码很容易理解和修改。
如果性能比较差:
保存可工作版本
评价系统,发现热点
确定问题根源(设计、数据类型、算法,调优是否适合
二、低效率的常见原因
(1)I/O
不必要的I/O操作,在允许的情况下,尽量使用内存运算
(2)Paging分页
导致OS进行内存分页操作的程序的运算速度,比不分页的慢很多
(3)系统调用
系统子程序调用代价高
部分系统子程序中包含了不易发觉的耗时的IO操作等
自己写服务 ,只实现必须的部分
让系统供应商优化其开发的被调用程序
(4)操作的相对性能消耗
三、对象创建与复用的代码调优
(1)单例模式(Singleton Pattern)
某些类在概念上只有一个实例
只创建一个对象,然后复用
对管理重用的代码进行封装
确保类只有一个实例,并提供一个全局访问点
只能有一个类的实例,并且客户端可以从众所周知的访问点访问它
当唯一的实例可以通过子类扩展时,客户端应该能够使用扩展实例而不修改它们的代码
类负责管理其唯一实例
构造器private,提供static方法和字段允许对唯一实例的调用
(3)原型模式
通过复制已有原型对象新创建对象
目标:创建或初始化对象代价高时,可通过此模式创建相似对象,降低开销
类似于文档模板,创建一次,多次被复制使用,作为撰写文档的起点。
原型模式在初始化创建第一个对象时开销大,然后将这些值作为原型存储在存储库中。
需要再次创建相同或类似对象时,只需从存储库中获取所有值已经预填充的原型副本。
(6)对象初始化
构造和初始化对象
利用new方法创建对象时,涉及的构造链会自动执行。开销大
应该检查构造函数层次结构以消除对实例变量的任何多重初始化
可以使用clone()替代构造方法,以避免链式构造
预分配对象
在应用程序中有空闲时间时尽早创建对象,并保留这些对象直到需要为止
延迟初始化
(5)函数相关的代码调优
良好的子程序分解是调优的强大工具
小巧而良好定义的子程序节省空间、易于优化、易于重写
六、I/O与日志的代码调优
(参考之前章节
七、数据结构与算法的代码调优
(参考数据结构与算法的相关课程
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!