代码优化的另一面

标签: 代码 优化 | 发表时间:2013-01-05 15:19 | 作者:
出处:http://pipes.yahoo.com/pipes/pipe.info?_id=10560380f804c7341f042a2b8a03e117

优化软件是一件好事,但如果使用不当,就会好事变坏事。如果你在优化代码时走向了错误的道路,那么这种优化会提高开发成本、降低生产力。在软件开发过程中,成本需要时刻谨记在心。一般来说,优化的软件需要花费更长的时间来交付,因为你需要花费精力使它质量更高。有时候,你并不是为了运行速度而做优化。对于嵌入式系统来说,可能是减少内存使用,对于手持设备,可能是硬件资源限制。优化的代码通常难以调试和维护,因为你需要牺牲一些代码可读性。优化良好的软件带来的好处要多于坏处,但是如果你做了错误的优化,那么结果恰恰相反。

到底怎么才能做好代码优化呢?Rick Cook给出了一些有用的 建议

你到底为了什么而优化

如果在优化过程启动时搞不清楚为什么而优化,那么你基本会走向错误的道路。你需要清楚的理解你准备完成的目标和相关的优化选择。这些目标需要清晰而且简洁,简单到项目经理能够理解它,你需要在优化过程中始终坚持这些目标。在软件开发过程中,变更是常有的事情。你可能一开始想优化这个目标,然后又发现需要优化其他目标。事实也是如此,但是请把这些目标的变更记录清楚。

性能测试团队报告的性能缺陷可能是优化的主要目标,一方面它来自于开发人员之外的客观性能问题,另一方面这些缺陷报告会明确的指出存在哪些问题,是运行缓慢,还是磁盘换页频繁等等。开发人员从这些缺陷中开始入手优化,比自己空想出的性能目标要合理、客观的多。

小心对待优化的衡量标准

选择正确的衡量标准是优化的重要步骤。你需要利用这些标准来衡量自己的优化进度。如果衡量标准是错误的,那么你的努力就白费了。即使是正确的标准,也需要正确的运用。有时候,把主要精力放在应用程序运行时间最多的代码部分上市正确的做法。不过请记住,Unix/Linux内核在空闲循环(idle loop)中花费的时间最多。这里的问题是,如果你不小心对待,那么你可能会选择一个不能帮助你解决问题的衡量标准。

衡量标准的选择应该取决于哪些标准能够确实提高用户体验。例如,有关数据库的性能分析指标有很多,开发人员和性能测试人员需要确定哪些指标是真正影响应用程序速度的,是bufferpool的大小,还是数据库连接池的大小。这是一个渐进的认识过程。

优化且只优化关键部分

这是有效优化的关键。寻找能够达到目标(性能、资源)的代码部分并集中精力。一个典型的例子是把时间花费在优化数据库上,而实际的性能杀手是缓慢的网络连接。

不要被映入眼帘的表象所吸引。这些表象并不一定会解决你的问题。只是因为某些事情易于发现而且易于优化并不意味着它们值得关注。 

高层次优化更好

一般来说,优化的层次越高,优化的效果就越明显。按此标准,最好的优化方法是寻找更好的算法。例如,在一些IT部门,员工花费几个月的时间来对某个软件做优化但是没有进展,然后找来一批新员工来做这些优化,他们很快就会发现性能的问题在于代码某处使用了冒泡排序或者某张数据库表增加了数以万条的记录等等。

建议大家花时间看看基本的应用架构,找找有没有可以优化的线索。但是,高层次优化不是银弹。一些基本的技术,比如把代码尽可能的移到循环体外面等等。

另外,高层次优化可以避免对代码细节的复杂重构。开发人员往往对低层次的优化最感兴趣,请控制住自己的欲望,从高处着手! 

不要过早优化

开发人员有一种冲动,那就是在编码的时候就准备优化了。一般来说,这不是个好主意。有时候,开发人员并不确定这样的优化工作是否值得。例如,你可能通过移位操作来代替乘法操作,但是这种性能优化的做法会产生让人非常难以理解的代码。

最好把开发和优化工作分开,先开发出正确的代码,然后再优化。过早优化的问题在于开发人员会有意的对软件的架构设计和代码结构等做一些预先的设想,而其中有相当一部分都是多余操心的,你可能不得不对这些多余的部分再做优化。

依靠性能分析数据,而不是直觉

你以为自己知道软件系统哪里需要优化,但是直觉是第二位的,数据是第一位的。否则,你会发现可能把一段代码优化的非常快,但是实际上很少被调用。

优化的一个有效的策略是,你要根据所做工作对优化效果的影响来进行排序。在开始工作之前找到影响最大的“路障”,然后再处理小的“路障”。 

不能指望优化解决所有问题

优化的重要法则之一是不能让优化解决所有问题,比如,提高运行速度会耗费更多系统资源。你必须为了主要的优化目标做出权衡。

InfoQ中文站的读者对代码优化有什么看法,欢迎发表自己的意见!

崔康 热情的技术探索者,资深软件工程师,InfoQ编辑,从事企业级Web应用的相关工作,关注性能优化、Web技术、浏览器等领域。

您可能也会喜欢

相关 [代码 优化] 推荐:

Java代码优化

- - ImportNew
2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化. 在修改之前,我的说法是这样的:. 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸鱼自然饱了. 代码优化一样,也许一个两个的优化,对于提升代码的运行效率意义不大,但是只要处处都能注意代码优化,总体来说对于提升代码的运行效率就很有用了.

代码优化概要

- raphael - 酷壳 - CoolShell.cn
Dobb’s Blogger的Walter Bright写的《Overlooked Essentials For Optimizing Code. 我编写程序至今有35年了,我做了很多关于程序执行速度方面优化的工(一个示例),我也看过其它人做的优化. 我发现有两个最基本的优化技术总是被人所忽略. 注意,这两个技术并不是避免时机不成熟的优化.

Java 代码性能优化

- - IT瘾-geek
代码 优化,一个很重要的课题. 可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢. 这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗. 没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了. 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的.

也谈JavaScript代码性能优化

- 可乐加糖 - Fdream's Blog
差不多两年前写了个选择器whiz,除在DOM查找方面做了许多优化工作之外,还在代码优化上做了很多工作,一直没有分享. 抽空总结一下,基本上在jQuery、Mootools和YUI的源码里面都可以看到这些写法. 有些是已经在网上分享很多遍了,众所周知的,也有一些可能写了多年的JavaScript的开发人员也不一定想得到的.

jQuery代码优化:基本事件篇

- - 可咔酷 | 网络杂货铺
jQuery对事件系统的抽象与优化也是它的一大特色. 本文仅从事件系统入手,简要分析一下jQuery为什么提供mouseenter和mouseleave事件,它们与标准的mouseover、mouseout事件有什么区别. 说到事件,就要追溯到网景与微软的“浏览器大战”了. 当时,事件模型还没有标准,两家公司的实现就是事实标准.

代码优化的另一面

- - InfoQ cn
优化软件是一件好事,但如果使用不当,就会好事变坏事. 如果你在优化代码时走向了错误的道路,那么这种优化会提高开发成本、降低生产力. 在软件开发过程中,成本需要时刻谨记在心. 一般来说,优化的软件需要花费更长的时间来交付,因为你需要花费精力使它质量更高. 有时候,你并不是为了运行速度而做优化. 对于嵌入式系统来说,可能是减少内存使用,对于手持设备,可能是硬件资源限制.

Android代码优化小技巧总结

- - 移动开发 - ITeye博客
关注微信号:javalearns   随时随地学Java. 这篇文章主要是介绍了一些小细节的优化技巧,当这些小技巧综合使用起来的时候,对于整个Android App的性能提升还是有作用的,只是不能较大幅度的提升性能而已. 选择合适的算法与数据结构才应该是你首要考虑的因素,在这篇文章中不会涉及这方面.

PHP代码优化24条真经

- - 外刊IT评论
使用echo的多重参数代替字符串连接. 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替. 对global变量,应该用完就unset()掉. 用单引号代替双引号来包含字符串,这样做会更快一些. 因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会. 函数代替正则表达式完成相同功能.

JAVA优化代码策略(一)

- - Web前端 - ITeye博客
在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身. 所以养成好的代码编写习惯非常重要. 比如:String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替. 由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理. 因此,生成过多的对象将会给程序的性能带来很大的影响.

Android性能优化篇:从代码角度进行优化

- - 移动开发 - ITeye博客
关注微信号:javalearns   随时随地学Java. 通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的. 一般来说,优秀的 程序员在写完代码之后都会不断的对代码进行重构. 重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.