大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

代码优化的另一面

  • 2013-01-05
  • 本文字数:1784 字

    阅读完需:约 6 分钟

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

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

你到底为了什么而优化

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

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

小心对待优化的衡量标准

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

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

优化且只优化关键部分

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

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

高层次优化更好

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

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

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

不要过早优化

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

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

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

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

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

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

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

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

2013-01-05 01:194129
用户头像

发布了 501 篇内容, 共 282.6 次阅读, 收获喜欢 64 次。

关注

评论

发布
暂无评论
发现更多内容

淘宝拍立淘接口,以图搜索相似商品接口

tbapi

淘宝API接口 淘宝拍立淘接口

国企数字化转型如何拥抱低代码开发?

不在线第一只蜗牛

低代码 数字化转型

蚂蚁知识图谱管理系统研究成果获国际顶会认可,KGFabric 论文入选 VLDB 2024

可信AI进展

利用淘宝商品评论API返回值进行竞品深度分析

代码忍者

回顾 Oracle 在 MySQL 8.0 中的管理工作

爱可生开源社区

MySQL oracle MySQL 8.0

大模型应用开发实战

不在线第一只蜗牛

AI 大模型

openGauss- 行级访问控制

Gauss松鼠会

opengauss

Sentieon 应用教程 | 使用CNVscope进行CNV检测分析

INSVAST

基因数据分析 生信服务 应用教程

轻松上手:快速部署天翼云 HBlock 轻量存储系统的真实体验

申公豹

天翼云HBlock

Rust China Conf 2024

非凸科技

俄罗斯即将启动跨境加密支付试行计划:规避制裁与加密货币的未来

区块链软件开发推广运营

交易所开发 dapp开发 区块链开发 链游开发 NFT开发

软件测试学习笔记丨Linux与SQL实战

测试人

Linux 软件测试 自动化测试 测试开发

AI真“卷出天际”!我国发布全球首个月球专业大模型;0代码可做游戏,谷歌发布世界首个AI游戏引擎|AI日报

可信AI进展

OpenAI 投资, 1X 家务机器人 NEO 发布;微软副总裁:AI 需「学会求助」而非「制造幻觉」丨 RTE 开发者日报

声网

共促国产AI生态繁荣,天翼云重磅发布魔乐开发者社区

天翼云开发者社区

云计算 开发者社区 天翼云

ETL数据集成丨SQLServer到Doris的无缝数据同步策略

谷云科技RestCloud

数据库 Doris ETL SqlServer 数据集成

通义灵码使用安装教程,3分钟快速上手体验

阿里云云效

阿里云 云原生 通义灵码

8款国内外免费AI生成视频工具对比实测!我们真的可以做到“一人搞定一部影视作品“吗?

可信AI进展

AI测评

万界星空科技机械加工行业MES解决方案

万界星空科技

mes 万界星空科技 制造业工厂 机械加工 机械加工mes

淘宝商品评论API:获取商品使用场景与评价

技术冰糖葫芦

api 网关 API Explorer API 策略 pinduoduo API

零售商商品规划新纪元:全面策略融合与智能计划系统引领未来

第七在线

DNS解析如何设置合适的TTL值?

防火墙后吃泡面

【论文速读】| 基于大语言模型智能体对文本到图像模型进行越狱

云起无垠

Web3 游戏周报(8.25- 8.31)

Footprint Analytics

代码优化的另一面_语言 & 开发_崔康_InfoQ精选文章