“整洁代码”竟让性能暴跌1.5倍
"Clean" Code, Horrible Performance (2023)
我们常被告知要写“整洁代码”,遵循多态、小函数和DRY原则。但通过实测对比,我发现这些规则可能带来巨大的性能代价。在计算图形面积的例子中,严格遵循“整洁代码”的多态实现,比使用简单的switch语句和扁平化结构慢了1.5倍。这意味着,盲目追求代码的“整洁”可能让你失去相当于三年硬件进化的性能优势。当编译器无法窥探虚拟函数调用的内部时,优化无从谈起。有时候,打破规则、让代码更“脏”一点,反而能换来极致的运行效率。
仅仅因为有人告诉你用多态代替switch语句,就抹去了三年硬件进化的成果。
HN 评论区
176- Aurornis
没错,一个玩具问题只需要简单的实现。这完全是个稻草人谬误。我甚至不太喜欢 Robert Martin 的《整洁代码》,但作者并没有触及这种风格真正能带来好处的地方。当你因为要支持某个新的业务流程而不得不更新 23 个 if 语句时,你就会希望有一个概念性的实体来封装针对这类流程的操作,这样你只需要在一个地方实现它们。
- taybin
我认为《整洁代码》属于那一类书籍/风格:对需要一些结构指导的初级开发者很有帮助,但对将其奉为教条的资深开发者却有害。
在漫长的职业生涯中,你迟早会遇到一个《整洁代码》狂热分子,他们带着一种优越感,不去审查代码的实际逻辑,反而对诸如“函数行数超过某个随意设定的数字”之类的细节吹毛求疵。这正是大多数人开始讨厌《整洁代码》的转折点。
- jayd16
好的,现在加一个 Path 形状,需要计算任意复杂度的多边形面积。
想想看,现在的工作负载将由实际计算面积的核心任务主导,从而降低了结构体使用带来的影响。
再想想实现这个改动所需的 diff。
虽然《整洁代码》不应被奉为圣经,但这个微基准测试并不是 CC 试图解决的问题的一个现实案例。
- aw1621107
相关讨论:
2023-02-28 发布的原文 HN 帖子(https://news.ycombinator.com/item?id=34966137),739 分,914 条评论
Casey(本文作者)与 Uncle Bob(《整洁代码》作者,Casey 正在批评其编程模式)之间的讨论,发布于 2023-03-11 的 HN(https://news.ycombinator.com/item?id=35105528),223 分,213 条评论
"Horrible Code, Clean Performance",一篇致敬 Casey 原文的文章,发布于 2023-04-19 的 HN(https://news.ycombinator.com/item?id=35596069),121 分,114 条评论
- jeffnash
在这些示例中,性能差异有多少是源于语言或编译器的选择?
如果在 Go、Rust 或 Java 中避免或使用某些模式,我会看到类似的性能提升或损失吗?这些例子和 C++ 中的一样吗?
那像 Ruby、Python 或 JavaScript 这样的动态语言呢?