C 式 OO 與 C++ virtual function 效能差異

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間16年前 (2009/03/08 15:13), 編輯推噓5(504)
留言9則, 5人參與, 最新討論串1/1
首先換個標題,不然老有人覺得這和原 po 要問的東西沒關聯。

03/08 12:52,
要不要測一下 alignment 32 XD 或者 64 如果有支援的話
03/08 12:52

03/08 12:53,
同樣 CODE 不同效能的問題 我是查到記憶體位置問題啦
03/08 12:53
是的,是記憶體位置的關係。

03/08 13:48,
誰寄信給Bjarne Stroustrup請他開釋一下
03/08 13:48

03/08 13:50,
不過我想強調的重點是,幾乎不會有人在 kernel 用 C 寫出
03/08 13:50

03/08 13:51,
這樣的東西,反倒是第一種 c + switch case + union 的居
03/08 13:51

03/08 13:51,
多,但是那種寫法通常比 C++ 用 vtable 跳還慢 XD
03/08 13:51

03/08 13:55,
你真的想量迴圈速度的話可能要用 getrusage() 抓比較準,
03/08 13:55

03/08 13:56,
因為 C++ 進入 main 前做的事情跟 C 不一樣。
03/08 13:56

03/08 14:26,
anyway, 新版: http://tinyurl.com/cmpr8k XD
03/08 14:26

03/08 14:28,
很有趣阿
03/08 14:28
我找到了罪魁禍首,那就是 new。若在 C++ 的版本中改用 malloc 來配置空間呢? void* buf = malloc(sizeof(Double)); Data* data = new(buf) Double(1.0); 結果是 C++ 的版本和 C 速度完全相同了!而且也和直接使用 function pointer 而不用 vtable 的速度相同。 為什麼使用 new 和 malloc 得到的記憶體會有效能上的差別,我猜 原因可能是 new 得到的記憶體區塊比較倒霉,比如說它剛好和 kernel 中的某些其它資料占據同一個 cache set 導致 miss rate 增加。這邊就要請比較了解這方面的板友指教了。 當然,效能魔人可能就會提出另一個質疑,那就是在 C++ 中大家都 用 new,除非是特殊需求才會自己去改寫 new。但以原 po 的問題來 看,寫 kernel 剛好就符合這個「特殊需求」,因為在 kernel 內部 配置記憶體的功能一定是自己寫的。另一方面,用個 operator overload 來改寫預設的 new 也不是那麼困難的事。 結論:若要達到動態多型的功能,使用 C function pointer 來實作 並不會比 C++ virtual function 還快,效能是相同的。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.120.91

03/08 15:18, , 1F
new 在以前被人詬病過對小物件配置很弱,後來有改過的樣子
03/08 15:18, 1F

03/08 15:19, , 2F
,不過我在 FreeBSD 上用一樣的 code 是 C++ 最快。
03/08 15:19, 2F

03/08 15:19, , 3F
可能跟 FreeBSD 的 libc 是 BSD libc 而非 glibc 有關。
03/08 15:19, 3F
※ 編輯: littleshan 來自: 59.121.120.91 (03/08 15:20)

03/08 15:35, , 4F
太有趣啦,不過我猜有的人會選擇性目盲
03/08 15:35, 4F

03/08 15:49, , 5F
我是覺得這件事很直覺啊... 不太需要實驗吧
03/08 15:49, 5F

03/08 15:54, , 6F
沒辦法,這世界上只信數字不信別人判斷的居多啊,加上環繞
03/08 15:54, 6F

03/08 15:54, , 7F
在這主題四周的爭議太多了,不如直接攻破核心。
03/08 15:54, 7F

03/08 21:10, , 8F
現在x86運算速度這麼快,有些效率的問題別太鑽牛角尖了,
03/08 21:10, 8F

03/08 22:28, , 9F
樓上不能這樣講阿 很多都是compiler經過無數的血尿出來的
03/08 22:28, 9F
文章代碼(AID): #19it03Ke (C_and_CPP)
文章代碼(AID): #19it03Ke (C_and_CPP)