写点什么

代码优化是一把双刃剑

  • 2021-02-20
  • 本文字数:1495 字

    阅读完需:约 5 分钟

代码优化是一把双刃剑

为何优化并不总是一个好主意?


优化是对已经开始工作的单元进行改进的过程。对于终端用户或客户来说,这就像是樱桃一样诱人。出于同样的原因,代码优化在软件行业非常流行。但是优化代码真的总是有益的吗?我在软件行业已经工作五年多了,我可以告诉你的是,代码优化是一把双刃剑。如果处理不当,它可能弊大于利。

 

在软件术语中,我们使用术语“过早优化”来表示不好或不必要的优化。说起来容易做起来难,实际上,发现过早优化并不容易。在这篇文章中,我将与大家分享一些可以帮助你进行优化并避免代码过早优化的方法。

 

让我们开始吧。

万恶之源

代码优化是修改软件系统的过程,目的是使程序执行得更快,或使其能够在运行时使用更少的内存或其他资源。大多数开发人员相信代码优化是软件开发过程中必要的一步。但事实上并非如此。永远不要过早尝试优化应用程序的代码——或只在需要时才尝试优化代码。


过早优化是编程中的一切(或至少大部分)恶之根源。——唐纳德·克努斯


基于简洁的思想写成的源代码足以满足 99%情况下的性能需求。而且这将极大地提高应用程序的可维护性。

 

例子:

  • 在 C 语言中使用指针运算代替数组符号,包括使用诸如以下风格的代码:

for (p = q; p < lim; p++)
复制代码

 

  • 在 Lua 中重新绑定全局变量到局部变量,例如:

local table, io, string, math= table, io, string, math
复制代码

 

简而言之,如果一种技术使程序更难以理解,那么这就是过早优化

 

过早优化的最大问题是,它可能会引入意料之外的 bug,并可能浪费大量资源和时间。

 

“毫无疑问,效率的圣杯导致了滥用。程序员浪费了大量的时间来考虑或担心他们程序非关键部分的速度,而这些提升效率的尝试实际上会对调试和维护产生强烈的负面影响。我们应该忘记那些小的效率提升,比如说 97%的情况下,过早优化是万恶之源。

 

然而,我们不应该错过这关键 3%的优化。一个好的程序员不会因为以上推理而沾沾自喜,他会明智地仔细审查关键代码,但必须是在这些关键代码被识别之后。”


— Structured Programming with go to Statements (1974)

为什么开发人员倾向于过早优化

人们往往在不知不觉中追求过早优化,这可能有多种原因,包括:

  • 他们很容易花大量时间思考不重要的事情,以取得错误的进步感。

  • 他们只是不知道如何提前计划,并弄清楚在开发过程的每个阶段他们应该从事哪些任务。

  • 他们甚至会在开始尝试之前就规划好未来的行动方案,因为纸上谈兵总是更容易。

  • 代表了一种现象,即人们花费不成比例的资源来处理相对次要的问题。 

如何避免过早优化

在确定是否应该优化某些东西时,你应考虑一些因素,并问自己几个重要的问题。

 

以下这些问题可以帮助你决定是否值得这么做:

 

  • 我们为什么要优化?

在此阶段是否真的有必要进行优化,或者您只是因为要避免处理其他问题而专注于此?

 

  • 优化的好处是什么?

您应该有充分的理由来优化它,因为它将需要资源。它应该足以值得每个人花费时间,并且对项目有重大的影响。

 

  • 优化的成本有多高?

实现优化需要多少团队努力和时间?这是否会影响项目正在进行中的工作流程?这类事情需要在执行之前进行评估。

 

  • 优化的后果是什么?

这种优化在不久的将来会给您带来什么问题?会增加应用程序的测试范围吗?

 

在回答了所有这些重要问题并在团队中进行讨论之后,就可以决定是否需要优化了。

最后的想法

任何以性能为名使您的代码难以理解的编码实践都是不值得的。在没有可衡量的性能问题的情况下,您不应该进行优化,因为这是过早优化,就算你认为自己会获得性能上的提升也不要这样做。

 

像其他所有性能问题一样,你应该在开始任何优化之前都进行评估。

 

英文原文链接:


https://codeburst.io/code-optimization-is-like-a-double-edged-sword-86ba957386cf

2021-02-20 16:562120

评论

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

基于开源Tars的动态负载均衡实践

vivo互联网技术

负载均衡 TARS

fil云算力系统开发具体流程丨fil云算力开发源码成品

系统开发咨询1357O98O718

面向对象的Python编程,你需要知道这些!

华为云开发者联盟

Python 面向对象 oop 面向对象编程

【LeetCode】你能在你最喜欢的那天吃到你最喜欢的糖果吗?Java题解

Albert

算法 LeetCode 6月日更

图表示学习+图神经网络:破解AI黑盒,揭示万物奥秘的钥匙!

博文视点Broadview

anyRTC SDK 5月迭代:优化自定义加密功能,让通信更安全

anyRTC开发者

音视频 WebRTC sdk

架构实战营模块五作业

竹林七贤

我把 Spring Boot 项目从 18.18M 瘦身到 0.18M,部署起来真省事!

xcbeyond

微服务 springboot 6月日更

TCP协议

IT视界

TCP 传输协议 网络通信

自适应微服务治理背后的算法

万俊峰Kevin

微服务 自适应 服务治理 Go 语言

毕业设计So Easy:珠穆朗玛FM音频电台APP

不脱发的程序猿

android 软件开发 APP开发 毕业设计 移动应用开发

华为云携手马栏山文创园助力湖南广电荣获国家广电总局多项大奖

华为云开发者联盟

AI 5G 视频 华为云 马栏山

🏆未来可期,WebRTC成为实时通讯方案的行业标准

洛神灬殇

音视频 WebRTC 实时通信 6月日更

【译】JavaScript 代码整洁之道-异常处理篇

KooFE

JavaScript 大前端 异常处理 6月日更 整洁代码

一文回顾 Java 入门知识(上)

逆锋起笔

Java 后端 javase

国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?

Serverless Devs

Serverless 容器 云原生

一封MySQL之父Monty的回信,开启彭立勋的数据库之路

华为云开发者联盟

MySQL 数据库 opengauss GaussDB 华为云数据库

网络攻防学习笔记 Day33

穿过生命散发芬芳

网络攻防 6月日更

火爆全网的迁移学习简明手册全面更新,重磅出版上市!

博文视点Broadview

云网络开山之作,揭秘云上高速公路的十年技术成果!

博文视点Broadview

你的同事是你的竞争对手吗?

石云升

战略思考 职场经验 6月日更

带你认识大模型训练关键算法:分布式训练Allreduce算法

华为云开发者联盟

分布式训练 Allreduce算法 集合通信 分布式通信算法 大模型训练

写给想做程序员的半吊子应届毕业生们

北游学Java

Java Python 求职 秋招

书单 | 5月畅销新书情报,你最Pick哪一本?

博文视点Broadview

Flink+Alink,当大数据遇见机器学习!

博文视点Broadview

云上创新,阿里云视频云分享全场景音视频服务背后的场景探索与技术实践

阿里云CloudImagine

阿里云 音视频 在线教育 视频会议 直播技术

Chia奇亚云算力挖矿系统开发成功案例丨Chia奇亚挖矿源码成品

系统开发咨询1357O98O718

LeaRun .Net Core/Java工作流引擎,分离式前端,升级Vue

雯雯写代码

Vue 工作流引擎

拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具

程序员小富

Java GitHub 编程 程序员 代码

为什么说混合云是新基建的流行架构?

博文视点Broadview

C 语言面向对象的封装方式

实力程序员

代码优化是一把双刃剑_语言 & 开发_Shubham Pathania_InfoQ精选文章