作者Hazukashiine (私は幸せです)
看板C_and_CPP
标题[讨论] 如果把省去所有函数呼叫的开销会快多少?
时间Thu Sep 29 17:05:02 2016
以 (SGI) C++ STL std::list 的例子来说:
因为涉及很多对资料结构低阶的操作,所以实作上势必有很多内部函数的呼叫,
像是 protected: void transfer(...); 就是一个明显的例子,被反覆呼叫很多次。
假使不在乎编译出来的执行档膨胀的问题的话,把执行的速度作为最高的原则,
那大家觉得如果把所有函式 inline ,能快上多少?快很多?还是一点点而已?
毕竟很多时候效能的瓶颈就卡在那个最底层的东西上面。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.66.155
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1475139910.A.DE0.html
2F:→ Hazukashiine: 哈哈哈哈哈哈 我昨天就在看这个耶 !!! 09/29 17:19
3F:→ Hazukashiine: 只是有点好奇 大家会怎麽觉得 OwO 09/29 17:20
4F:→ Caesar08: 那你就知道 你问的问题很难有正确答案了 09/29 17:20
5F:→ Hazukashiine: 但是我已经快要有答案啦哈哈哈 因为我正实作一个 09/29 17:22
6F:→ Hazukashiine: 完全没有函数呼叫开销的 linked list container 09/29 17:22
7F:→ Hazukashiine: 正因为他们说不一定 所以才更想知道 如果做出来了 09/29 17:24
8F:→ Hazukashiine: 到底是变快还是变慢 还是根本没影响 09/29 17:24
9F:→ Caesar08: gcc有__attribute__((always_inline)) 09/29 17:28
10F:→ Caesar08: VC++有__forceinline。把这个加在他们实作的std::list就 09/29 17:28
11F:→ Caesar08: 好了吧? 09/29 17:29
12F:→ Hazukashiine: 那个还没试过 但是我想要用 C 语言去实作这样的东西 09/29 17:37
13F:推 pili100: 有实验精神 09/29 17:59
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
14F:→ uranusjr: 现在 compiler 太聪明了, 看到 hotspot 自动就会 inline 09/29 18:31
15F:→ uranusjr: 真想在 release build 测出效能差别还满难的 09/29 18:32
16F:推 chchwy: 把optimize开起来 那些函数几乎全部都被inline 09/29 22:23
17F:→ rodion: 不见得会变快 如果碰到膨胀的CODE导致cache miss的话 09/30 10:11
19F:→ Hazukashiine: 哈哈哈这是一楼附的链接啊 XDDD 默契 09/30 10:26
20F:→ LiloHuang: 没留意到之前有人贴过,总之多做 code profiling 09/30 21:58