作者wiz (好天)
看板Soft_Job
標題Re: [分享] 面向對象編程從骨子裡就有問題
時間Thu Feb 28 10:07:12 2013
※ 引述《mgtsai ()》之銘言:
: ※ 引述《mahoihei (Alvar)》之銘言:
: : 早上看到一篇對個人來說很衝擊性的文章
: : http://goo.gl/z4Fa3
: : 為什麼說是很衝擊性,因為我自己的編程基礎由oop開始的
: : 而在oop design更是我在這個領域最喜愛的地方
: : 想問大家對這篇文章有什麼見解??
: 點進去看這個 URL,幾乎只是引述別人所講的隻字片語
: 這樣子作文風格,不太對我的胃口,看起來很像是直銷傳單中所慣用的技倆
: 不過文章末尾有 3 個 link,最後一個是 Sony PS3 RD 所寫的投影片
: 我覺得這份投影片倒是滿值得參考的
: 指出在 game design 時某些地方使用純 OOP 實作,會帶來不良後果
: (Tony Albrecht,現在是一家公司的 founder)
: ----------
: 投影片中的範例,其中之一提到,以目前眾家 compiler 的實作中
: 會將同一個物件的所有 member variable 所需的記憶體配置在同一塊區域內
: (以物件本身作為 memory locality)
: 但這個模式,在重複性大量資料處理中,卻會發生一個嚴重的副作用:
不管是不是object, 記憶體配置, 大致上都會和宣告順序以及compile unit,
會有正相關, 也就是說, 會盡可能的配置在一起.
我的理解, 投影片中, 提到的問題, 在一般用data structure (ex: 使用C language)寫法,
也有機會發生 (只是 OOP 可能比較容易讓人寫出這樣的方式).
簡單來說:
投影片中, 當 "m_Dirty == false", 就讓之前的cache 白費掉了
所以提出的改善方式如下:
1. 使用 homogenous, sequential sets of data 的配置方式:
一般來說, 在C language 中, 可能也會這樣寫
struct Object
{
Matrix4 m_Transform;
Matrix4 m_worldTransform;
....
};
"pre-load in cache" 是"可能" 隨時發生的
因為當要作Matrix 運算時, 一定會要先存取某個 node,
(不管是c++ 中, 封裝成 object, 或是C 中, 使用structure)
所以, 作者在"structure"內部中, 改用指標的方式,
這樣當某個條件不成立的時候, 才不會"損失"嚴重.
2. 重新改寫code, 並使用 custom allocators, 來配置連續的記憶體,
因此 "pre-load in cache" 的東西,就變成那些 必要的東西,
不需要的也不會先load 進來
3. 接著, 因為資料存取變成"可預測", 所以可以直接用"prefetch" 的指令,
來做"人肉預測", 而不是讓CPU 去猜. 因而可以再提昇一些效率.
4. 投影片中, 也提到, multi-threading 下, 可能會有不同的影響.
(先在都是multi-core cpu, 以矩陣運算這個case, 不善用cpu,
也說不過去.)
而對於某些人來說, 封裝成object, 反而會讓他更容易(方便)寫出
平行運算的程式.
雖然這個投影片中, 一開始有提到 OOP, 但我認為真正的重點,
就是最後提到的
"Its all about the memory", "Optimise for data first"...
這樣不管用什麼樣的編程方法, 才能寫出"有效率"的程式出來
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.86.30.230
※ 編輯: wiz 來自: 219.86.30.230 (02/28 10:12)
→ Lordaeron:OOP GEEKS 還真不, 都用pitfalls了. 還要轉 02/28 10:29
→ Lordaeron:這些文章,頂多是將OOP請下神壇變回人而已. 還在拗, 就 02/28 10:42
→ Lordaeron:不好囉. 02/28 10:42
推 neutronstars:能參考下面文章DOD的想法,再回頭看看這個討論串 02/28 14:20
→ wiz:我只是在說明投影片中講的重點, 至於oop, 只是個方法,人是活的 02/28 21:57
→ Lordaeron:咦是呢, 哪OOP 就沒什麼好講的了, 就跟人家說 03/01 00:36
→ Lordaeron:你自己看著辨就好了? 03/01 00:37
→ Lordaeron:所以,一直講OOP 的OOXX 後, 最後要補一句"要看事辨事?" 03/01 00:37
推 snaketsai:所以imperative是王道這樣? 03/01 01:58