[討論] 如果把省去所有函數呼叫的開銷會快多少?

看板C_and_CPP作者 (私は幸せです)時間9年前 (2016/09/29 17:05), 9年前編輯推噓3(3017)
留言20則, 7人參與, 最新討論串1/1
以 (SGI) C++ STL std::list 的例子來說: 因為涉及很多對資料結構低階的操作,所以實作上勢必有很多內部函數的呼叫, 像是 protected: void transfer(...); 就是一個明顯的例子,被反覆呼叫很多次。 假使不在乎編譯出來的執行檔膨脹的問題的話,把執行的速度作為最高的原則, 那大家覺得如果把所有函式 inline ,能快上多少?快很多?還是一點點而已? 畢竟很多時候效能的瓶頸就卡在那個最底層的東西上面。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.66.155 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1475139910.A.DE0.html

09/29 17:17, , 1F
來看Standard C++怎麼說https://goo.gl/5QiT8y
09/29 17:17, 1F

09/29 17:19, , 2F
哈哈哈哈哈哈 我昨天就在看這個耶 !!!
09/29 17:19, 2F

09/29 17:20, , 3F
只是有點好奇 大家會怎麼覺得 OwO
09/29 17:20, 3F

09/29 17:20, , 4F
那你就知道 你問的問題很難有正確答案了
09/29 17:20, 4F

09/29 17:22, , 5F
但是我已經快要有答案啦哈哈哈 因為我正實作一個
09/29 17:22, 5F

09/29 17:22, , 6F
完全沒有函數呼叫開銷的 linked list container
09/29 17:22, 6F

09/29 17:24, , 7F
正因為他們說不一定 所以才更想知道 如果做出來了
09/29 17:24, 7F

09/29 17:24, , 8F
到底是變快還是變慢 還是根本沒影響
09/29 17:24, 8F

09/29 17:28, , 9F
gcc有__attribute__((always_inline))
09/29 17:28, 9F

09/29 17:28, , 10F
VC++有__forceinline。把這個加在他們實作的std::list就
09/29 17:28, 10F

09/29 17:29, , 11F
好了吧?
09/29 17:29, 11F

09/29 17:37, , 12F
那個還沒試過 但是我想要用 C 語言去實作這樣的東西
09/29 17:37, 12F

09/29 17:59, , 13F
有實驗精神
09/29 17:59, 13F
void _M_transfer(_List_node_base* const __first, _List_node_base* const __last) throw () __attribute__((always_inline)); 剛剛把呼叫最多次的 _M_transfer 加上 compiler hint 一點效能改變都沒有 然後為了確定改的是正確的地方 偷偷把 attribute 拼錯 果然編譯失敗 XDDD http://imgur.com/1OVjug5
我猜編譯器應該已經預設 inline 了吧(? ※ 編輯: Hazukashiine (140.113.66.155), 09/29/2016 18:13:42

09/29 18:31, , 14F
現在 compiler 太聰明了, 看到 hotspot 自動就會 inline
09/29 18:31, 14F

09/29 18:32, , 15F
真想在 release build 測出效能差別還滿難的
09/29 18:32, 15F

09/29 22:23, , 16F
把optimize開起來 那些函數幾乎全部都被inline
09/29 22:23, 16F

09/30 10:11, , 17F
不見得會變快 如果碰到膨脹的CODE導致cache miss的話
09/30 10:11, 17F

09/30 10:21, , 18F
inline 影響速度的可能性很多 https://goo.gl/AWM8UN
09/30 10:21, 18F

09/30 10:26, , 19F
哈哈哈這是一樓附的鏈接啊 XDDD 默契
09/30 10:26, 19F

09/30 21:58, , 20F
沒留意到之前有人貼過,總之多做 code profiling
09/30 21:58, 20F
文章代碼(AID): #1NxDb6tW (C_and_CPP)