[英]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.