“过早优化是万恶之源” —— 克努特优化原则
2024年11月14日 • ☕️ 2 min read
“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.” —— Donald Knuth
在绝大多数时候,过早优化是万恶之源
这个原则并不是说在开发的时候不需要考虑优化的问题,而是说,对于一些极端的性能优化上(例如某些语句运行速度、cpu 使用率等),不要过早的考虑,例如:
const num = "123"
console.log(+num)
console.log(Number(num))
这两种写法都是为了将字符串 num
转成数字类型,前者在性能上面会比后者稍微好一点(执行速度快 2-3 ms)。对于这种情况,我们应该优先确保代码的可读性和可维护性。
- 不要过度优化这种微小的性能差异
- 选择你认为更易读和维护的写法
- 如果不是在性能极其敏感的循环中,这种差异完全可以忽略
所以我个人比较推荐实用 String()
、Boolean()
、Number()
等方法来进行类型转换,这样可以让代码有更高的可读性。
何时优化
在确定是否应该优化某些内容时,应该考虑以下几个因素,应该问自己的几个重要问题:
-
为什么要优化? 你认为在这个阶段,这种优化是必要的,这意味着它将对你的工作产生显著的、积极的影响,还是你现在仅仅关注它,因为你试图避免处理其他事情?
-
优化的好处是什么? 从优化中你能得到什么?
-
优化的成本是多少? 为了进行这种优化,你需要花费什么资源?
-
优化可能带来的负面后果是什么? 这种优化在将来会给你带来什么样的问题?
-
这种优化有多大可能会过时? 你现在正在做的优化工作以后是否有重大意义,或者这种优化是否可能过时?请注意,仅仅因为某些东西稍后可能会过时并不意味着你现在不应该处理它,但是这种情况发生的可能性,它发生之前需要的时间以及你在此期间将获得的好处,都是你决定是否优化应考虑的因素。
-
推迟这种优化有哪些优点和缺点? 推迟这个特定的优化有什么坏处吗?或许以后你会获得更多的相关信息,你会更好地处理它?
-
你还能做什么? 如果你不把时间和资源花在优化上,你会把它们花在什么上?如果你有其他的事情可以做,你是否从中获益更多?