油漆工Shlemiel演算法-把線性效能變成次方級表現方式

  • 3082
  • 0

油漆工Shlemiel演算法-把線性效能變成次方級表現方式

Dotblogs 的標籤:,

最近常常遇到一些效能Tunning的問題,扣掉商業邏輯限制外,常常會在Tunning的程式中,發現油漆工Shlemiel演算法(我個人比較喜歡稱之為油漆工樣式 :p)。這不是個好東西啊,其實是個爛笑話:

以下取自約耳趣談軟體Page7:

Shlemiel得到一個在路上塗油漆的工作,他要漆在路中間的間斷分隔線。第一天他拿了一罐油漆去漆好了300碼的路。「做得真好!」他的老闆說「你手腳真快啊!」然後就給他一個銅板。
第二天Shlemiel只漆了150碼。「這樣啊,沒有昨天好,不過也還是很快。150碼也很了不起。」也給他一個銅板。第三天Shlemiel只漆了30碼。「只有30碼而已!」老闆就哇哇大叫了。「這實在是無法接受!第一天你漆了十倍的長度耶!究竟怎麼回事啊?」
「我也沒辦法啊,」Shlemiel說「我每隔一天就離油漆罐愈來愈遠啊!」

事實上,油漆工樣式要表達的是:因為只會使用高階或已包裝好的元件(油漆、刷子、尺規)來完成工作目標,卻因為對基礎知識的不足(油漆桶要帶在旁邊),導致初上手很快完成,但工作量增加或持續作業時間拉長時,工作效率就大幅衰減,而且是以拋物線方式下降。

這種情況,還真的很常在新手程式員身上出現(幾乎不可免,我自己也是過來人啊)。更有甚者,已有三、四年經驗的程式員也常會「應用」此樣式。

要注意啊,當我們發現某個功能應該要有線性效能,實際上卻是次方級的表現,就要尋找隱藏的Shlemiel。不當的字串處理方式、型別瘋狂轉換、迴圈濫用、記憶體配置不當(白話:可以重覆使用的物件卻不斷重新建構),都是很常見的Shlemiel啊!

雖然現在的電腦等級都很高,但是還是禁不起多人同時使用被套用油漆工樣式的功能,Garbage collection可是很厲害的效能殺手啊!

--------
沒什麼特別的~
不過是一些筆記而已