→ ogamenewbie:?... 為什麼是 period? 04/01 19:58
→ AmosYang: ↖ ? 04/01 20:26
→ ogamenewbie:第 65 行 YOU ARE WRONG, period. 04/01 20:30
啊,那邊沒有寫得很清楚,應該修正為
如果你會花時間讀我寫的東西 (代表你的查克拉還不夠強大)
能用 OS / app-tier 內建的 cache 機制就乖乖用
如果你認為你自製的 cache 能表現得比 OS / app-tier 內建的 cache 還要好
YOU ARE WRONG, period. (最後只會事倍功半而已)
這段的由來是因為看了幾個 case, 苦主都是自作聰明自己發明一套 cache 機制
卻對 OS / .Net 沒有很深入的了解
(例如,了解 gen 0 1 2 heap / GC.Collect() 真正如何運作)
導致最後 perf. 大爆炸
而最後 fix 很簡單: comment out 苦主自己發明的 cache 機制就好了 XD
這段的用意並不是說要完全捨棄所有的 "自製 cache 機制"
而是指「在發明你自己的 cache 機制前,
務必要從頭到尾完全了解整個 technology stack」
不然的話只會自找苦吃
※ 編輯: AmosYang 來自: 65.87.177.87 (04/01 20:55)
→ AmosYang:補述了一段,希望有講得更明白些 :) 04/01 20:57
推 ogamenewbie:原來如此. (為那些苦主默哀) 04/01 21:31
有一點時間,來簡述一個上面所講的自殘 cache 機制的 .Net 案例
苦主的機器上有數十 GB 的記憶體,但卻沒事就丟 OutOfMemory (OOM) exception 出來
最後發現,他老兄自作聰明地開無雙 byte[] 來 cache 一些大檔案
當然,在測試的一切順利,一上 production server 時就爆炸了
奇妙的是,整個機體上記憶體還很多,為什麼 OOM 炸個不停?
原因很簡單,他開的無雙 byte[] 都是動輒數百 KB 甚至上 MB
沒兩三下就把 gen 2 heap 打了個亂七八糟,fragmentation 慘不忍睹
最後就 OOM 炸個不停
最後解決辦法很簡單, file cache 就讓 OS / .Net 來做就好了
註解掉苦主的無雙 file cache 後,天下太平
雖然在處理某幾個檔案時會比之前慢,但整體 server 的效率卻提昇不少
(因為沒有 OOM exception 來扯後腿)
事後苦主在了解整件事的來龍去脈後,有試著重寫他的無雙 file cache
最後效率並沒有比 OS / .Net 的 cache 好多少 (大約 1~2%)
並不值得多花成本去維護無雙 file cache 的程式碼
senior programmer 一小時的時間成本要上百美元
多買幾條 RAM 還便宜點 XD
套一句之前在 PLT (還是 OOAD?) 板看到的名言的翻譯來收尾 XD
未成年就這麼優,是一切邪惡的根源
"Premature optimization is the root of all evil." -- Donald Knuth
…有空再來補述 perception vs. performance 之間的愛恨情仇 XD
※ 編輯: AmosYang 來自: 65.87.177.87 (04/02 20:35)
→ AmosYang:補述一個 未成年就這麼優 的案例… XD 04/02 20:36
※ 編輯: AmosYang 來自: 65.87.177.87 (04/02 20:48)
→ AmosYang:在補述裡補述另一小段… 04/02 20:48
推 willieliao:五星物語在我國中的時候就很紅了,現在變成35歲的大叔 04/03 00:01
→ AmosYang:突然發現我離「大叔」也不很遠了… 哭哭 04/03 11:31
推 KanoLoa:看完之後決定回去好好重念OS 04/04 03:11
→ AmosYang:妖魔化Java板就交給吾輩,樓上好好照顧正妹同學就好 XD 04/04 21:14
推 godfat:是 PLT, 語出 lukhnos 04/10 03:46
→ AmosYang:感謝樓上補述 :D 04/17 06:46