Linux-Kernel
為什麼 Linux 核心沒有像 glibc 那樣優化的函式(例如,memchr、strchr)?
自己嘗試實現C字元串庫的時候,發現glibc和Linux核心實現一些功能的方式不同。例如,glibc memchr和glibc strchr使用一些技巧來加速函式,但核心 memchr和核心 strchr沒有。為什麼 Linux 核心函式不像 glibc 那樣優化?
核心在特定於架構的目錄中確實具有其中一些功能的優化版本;例如,參見 x86 實現
memchr
(參見所有memchr
定義和所有strchr
定義)。您找到的版本是備份通用版本;你可以通過尋找保護檢查來發現這些,#ifndef __HAVE_ARCH_MEMCHR
formemchr
和#ifndef __HAVE_ARCH_STRCHR
forstrchr
。C 庫的優化版本確實傾向於使用更複雜的程式碼,所以上面並沒有解釋為什麼核心不竭盡全力加快速度。如果您能找到核心將從這些功能之一的更優化版本中受益的場景,我想一個更新檔會受到歡迎(有適當的支持證據,並且只要優化的功能仍然可以理解 - 請參閱關於
memcpy
)。但是我懷疑核心對這些函式的使用通常不會讓它變得值得。例如memcpy
,相關函式往往用於核心中的小緩衝區。並且永遠不要低估適合記憶體或可以內聯的短函式的速度增益……此外,正如Iwillnotexist Idonotexist所提到的,MMX 和 SSE 不能輕易地在核心中使用,許多記憶體搜尋或複制功能的優化版本都依賴於它們。
在許多情況下,無論如何,使用的版本最終都是編譯器的內置版本,並且這些都經過大量優化,甚至比 C 庫的版本還要好(例如,
memcpy
通常會轉換為寄存器載入和儲存,或者甚至是一個固定的商店)。