簡體   English   中英

C 中的內聯實際上如何減慢該程序的速度?

[英]How can inlining in C actually be slowing down this program?

為了強制不內聯占用 46% 運行時間的 function,我在其上使用了__attribute__((noinline))並使用gcc -Wall -Winline -O2編譯代碼(這些加上-g是什么由 Makefile 使用 - 我在使用-g時也看到大致相同的效果)使用 gcc 4.5.2。 我發現帶有非內聯 function 的程序比原來的快 20% 以上。 有誰知道這可能是為什么?

讓我提供更多細節。 發生這種情況的程序是 Linux 的最新版本的壓縮實用程序bzip2 程序中的關鍵 function(在 compress.c 中找到 generateMTFValues)是執行移至前端轉換的關鍵。 這個 function 在程序中只被一個 function 調用。

有誰知道為什么程序在這種情況下通過強制編譯器不內聯這個 function 來運行得更快? function 只接受一個參數——一個指向包含所有塊和壓縮信息的結構的指針。 此外,它只調用另一個 function 並不會真正消耗任何大量的處理時間。

它會減慢程序的速度,因為生成的代碼更大並且會導致更多的 CPU 指令緩存未命中。

這是一個基於近乎完美無知的完整 WAG(Wild Ass Guess)。

難道對於內聯版本,優化器真的忙於處理哪些值在哪些寄存器中以及什么時候? 如果是這種情況,過程調用版本可能會為其提供空間,以便將更多寄存器用於循環中發生的事情。

正如我所說,只是一個 WAG。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM