軟件慢 10 倍根因不在代碼,在架構期的串行依賴
軟件慢 10 到 100 倍的根因不在代碼技巧,而在架構層的串行依賴;正確優化是鎖定硬件理論峰值再量差距——前提是架構決策者懂彙編。
原視頻在 YouTube 上放不出來,用音頻聽:
核心論點 · 點時間戳可跳到原聲
性能被忽視是激勵問題,不是技術問題
Casey 認為開發者普遍不關注性能,機制有三層:企業軟件裡用戶不是購買者,決策者只看成本、合規與法律責任,性能好壞不影響成交;壟斷效應讓社交網絡這類平臺難以靠性能被挑戰,體驗再差用戶也走不了;第三個原因是過去十年呼籲性能的人已經產生效果,性能正在重新被重視。三條疊加解釋了為什麼「讓軟件變快」在公司裡常常沒有話語權,也說明性能問題本質是激勵問題。
— Casey Muratori先剖析再優化不是專家做法
Casey 強調行業裡真正的優化專家不會先剖析再改熱點。正確順序是:先問這個系統必須執行哪些操作,再查底層硬件在理論峰值下能做什麼,然後測量理論最大值與當前實現之間的差距,最後努力縮小差距。這樣做有兩個好處:不會被局部熱點帶偏,能發現硬件新特性,進而提升自己的優化能力。他明確指出「先測量熱點再優化」不是專家做法,而是把優化當成事後補救。
— Casey Muratori串行依賴鏈在架構期就決定了性能上限
「過早優化是萬惡之源」這句話的真正問題在於:如果架構階段就形成了串行依賴鏈,後期靠優化熱點根本無法挽救。Casey 舉例,代碼模式若是「請求-處理-再請求」,性能專家也無能為力,因為串行依賴無法並行化。軟件的性能通常由最長的串行依賴鏈決定,而這條鏈在架構期就定型了。所以架構選擇一旦出錯,後續所有性能優化都是在錯誤的地基上蓋樓。
— Casey MuratoriAI 公司正在還上一代的語言債
Uber 曾因 Python 和 Node.js 的單線程問題轉向 Go 和 Java。如今 OpenAI 和 Anthropic 面臨同樣的故事:數據科學家熟悉 Python,所以初版全用 Python,但產品要支撐多線程和更多連接,現在開始評估遷移到 Rust 或 Go。Casey 的潛臺詞是,AI 公司正在經歷基礎設施的「語言債務」期,而這一幕在上一代互聯網公司身上已經發生過,歷史正在重演。
— Casey MuratoriGTA6 慢是因為它要替換公司的印鈔機
Casey 從商業結構解釋 GTA6 為什麼開發週期那麼長:GTA5 在線模式當時是收入最高的娛樂產品,年入數十億美元。GTA6 不是做一個新遊戲,而是替換公司最賺錢的產品,所以 Rockstar 和 Take Two 不能失敗,還得規劃在線部分,避免新產品蠶食舊產品收入。GTA5 的成功對他們是意外,GTA6 是第一次真正更新旗艦產品,相當於重新發布 Google 搜索——這是極端保守的開發邏輯。
— Casey Muratori虛函數真正的代價是編譯器不敢優化
很多人以為虛函數調用本身開銷大,Casey 糾正說真正代價是編譯器失去優化能力。當編譯器無法確定運行時類型時,就無法內聯、合併冗餘代碼、做向量化,性能損失遠大於一次間接調用。他在 Clean Code 視頻裡展示的退化還相對溫和,實際生產環境可能更嚴重。多態代碼慢的不是那一次分派,而是整個周圍代碼都失去了被自動化的資格。
— Casey Muratori原話 · 已逐字校驗
That is not how anyone has ever, you know, I've worked with many extremely good optimization people, and that is not how it is done. The correct way to do optimization is very much like what you just said. You first go, what are the operations that this system has to perform? What is the underlying hardware capable of doing at its theoretical peak? And then you measure the delta between that theoretical maximum and what you have achieved.
這不是任何人曾經做過的方式,我合作過許多極其優秀的優化專家,這不是他們的做法。正確的優化方式正如你所說:首先,這個系統必須執行哪些操作?底層硬件在理論峰值時能做什麼?然後你測量理論最大值與你實際達到之間的差距。
Casey Muratori22:29
The performance of your software is generally determined by the longest serial dependency chain because it's something that cannot be paralyzed.
軟件的性能通常由最長的串行依賴鏈決定,因為這是無法並行化的。
Casey Muratori33:53
The way to think about it is your code base will not end up that way by accident. In most cases anymore. You have to engineer up front for a hotspot code base that people can then optimize.
思考方式是,你的代碼庫不會偶然變成那樣。在大多數情況下,你必須預先設計一個可優化的熱點代碼庫,以便人們後續優化。
Casey Muratori35:56
Grand Theft Auto 5 at the time was, if I'm not mistaken, by far the most revenue generating entertainment product in existence. The online part of that game was generating like billions of dollars.
如果我沒記錯的話,GTA5 當時是現存收入最高的娛樂產品。它的在線部分產生了數十億美元的收入。
Casey Muratori1:13:25
in my experience, usually the code that is architected properly is also the code that runs quickly.
根據我的經驗,架構良好的代碼通常也運行得快。
Casey Muratori1:25:13
I don't think people should necessarily take a book recommendation from me. I want to recommend that people read a paper.
我不認為人們應該接受我的書單推薦。我想推薦人們去讀論文。
Casey Muratori1:50:13
I don't know if they're good at that, but I'm guessing that's something they could do.
我不知道他們是否擅長這個,但我猜這是他們能做的事情。
Casey Muratori1:51:15
數字與實體
| 軟件運行速度比需要慢的倍數 | 10x-100x | 0:00 |
| Linear 操作預算 | 300ms | 19:22 |
| 網絡 ping 時間 | sub 10ms | 20:25 |
| Python 中 A+B 的彙編指令數 | 遠多於 C 的一條 add 指令 | 44:26 |
| Steam 年發布遊戲數 | 數萬到十萬 | 1:07:59 |
| Clean Code 視頻性能差距 | 1.5 到 15 倍 | 1:16:32 |
| GTA5 在線收入 | 數十億美元 | 1:13:25 |
| AI 代碼質量轉折點 | 2024 年 1 月 | 1:38:46 |
| AI 全面評估所需時間 | 至少 6 個月到 1 年 | 1:39:47 |
術語
- theoretical peak理論峰值
- 硬件在理想條件下能達到的最大吞吐,是優化目標的基準。
- serial dependency chain串行依賴鏈
- 一系列無法並行、必須順序執行的操作,決定軟件延遲下限。
- hotspot熱點代碼
- 程序中消耗最多 CPU 時間的部分,常是優化的自然切入點。
- branch prediction分支預測
- CPU 預測分支走向以保持流水線滿載的機制,預測失敗代價高。
收聽指南
寫後端或業務代碼的程序員、做技術選型的架構師,以及正在用 AI 重寫技術棧的初創團隊——產品慢但說不清慢在哪的人尤其該聽。
若時間緊可跳過 1:16 到 1:25 的 Clean Code 視頻復盤,聽結論即可;遊戲行業部分看似離題,其實是全片最有預測力的內容。