写点什么

代码优化的另一面

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

    阅读完需:约 6 分钟

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

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

你到底为了什么而优化

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

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

小心对待优化的衡量标准

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

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

优化且只优化关键部分

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

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

高层次优化更好

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

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

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

不要过早优化

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

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

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

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

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

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

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

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

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

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

关注

评论

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

现代数据建模:推动人工智能驱动型企业的革命

伤感汤姆布利柏

中国企业出海新征程:数据基础设施如何成为全球化竞争的关键变量

镜舟科技

企业出海 存算分离架构 StarRocks 湖仓一体 数据基础

AI音乐智能陪练系统:你的24小时个性化音乐导师

上海拔俗

如何找到心仪的 ChatBI 智能体?Aloudata Agent 推荐给你

Aloudata

数据分析 agent ChatBI 智能数据分析 智能问数

UU 跑腿使用通义灵码实现 AI 原生应用架构升级全解析:行动指南

阿里巴巴云原生

阿里云 AI 云原生 通义灵码

【浪潮海岳inDatax数据中台专栏】浅谈主数据管理系统与业务系统的集成策略

inBuilder低代码平台

数据中台 主数据管理平台 数据集成方案 inDataX

云栖实录 | DataWorks 发布下一代 Data+AI 一体化平台,开启企业智能数据新时代

阿里云大数据AI技术

阿里云 Dataworks 大数据AI

IDC最新报告:谷云科技iPaaS订阅市场稳居独立厂商第一,市场份额全国第二,仅次于华为!

谷云科技RestCloud

IDC 集成平台 ipaas

云栖实录 | 理想汽车基于 Hologres + Flink 构建万亿级车联网信号实时分析平台

阿里云大数据AI技术

flink 阿里云 hologres 实时分析 理想汽车

深夜办公室的叹息,被微擎 IP 市场拉回正轨

微擎应用市场

(二)从分层架构到数据湖仓架构:数据仓库分层下的技术架构与举例

白鲸开源

大数据 数据湖 技术架构 白鲸开源 数据湖仓库

阿里云加持,《泡姆泡姆》让全球玩家畅享零延迟冒险

阿里巴巴云原生

阿里云 云原生

基于华为云开发者空间-Versatile Agent开发平台构建昇腾C算子开发知识库

华为云开发者联盟

华为开发者空间 Versatile Agent.

2025楼宇对讲行业十大品牌技术亮点汇总 从AI芯片到加密防护核心信息梳理

新消费日报

16 倍性能提升,成本降低 98%! 解读 SLS 向量索引架构升级改造

阿里巴巴云原生

阿里云 云原生 sls

科研决策AI辅助系统:让科学家“看得更远、想得更深

上海拔俗

预祝 1024!X2SeaTunnel:一场 AI Coding 与数据平台结合的深度实践

白鲸开源

大数据 开源 数据迁移 Apache SeaTunnel X2SeaTunnel

服务区智慧管理系统

深圳亥时科技

ERP上线:为什么IT部门说了不算?

优秀

ERP

出席2025年IDC中国CIO峰会,天翼云息壤赋能千行百业数智升级!

天翼云开发者社区

数字化转型 息壤

【10.29 直播】IoTDB 图形化工具与编程框架集成实操

Apache IoTDB

第一!天翼云引领中国教育公有云市场

天翼云开发者社区

公有云 天翼云

利用排列组合法实现TOPN路径计算

天翼云开发者社区

CDN 全站加速

速看!用 Apache SeaTunnel 轻松实现数据到 S3 Tables 的快速集成

白鲸开源

AWS CDC Apache SeaTunnel Apache Iceberg S3 Tables

预祝 1024!X2SeaTunnel:一场 AI Coding 与数据平台结合的深度实践

白鲸开源

大数据 AI 数据同步 Apache SeaTunnel AI coding

基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南

阿里巴巴云原生

阿里云 云原生 nacos Spring AI Alibaba

AI智能体有哪些?5个必备的Agent工具盘点

职场工具箱

人工智能 智能体 agent AIGC AIAgent

基于华为开发者空间-云开发环境(容器)+MaaS实现智语灵犀-AI对话助手

华为云开发者联盟

MaaS DeepSeek v3 华为开发者空间

白鲸开源数据基建平台荣登“创客北京 2025”企业组TOP150,共同助 Agentic AI 行业变革

白鲸开源

AI 开源商业化 白鲸开源 WhaleStudio Agentic AI

金融智能体,站在商业模式的旷野

脑极体

AI

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