2012-04-19 43 views
4

我知道存在內存緩存,因此使用來自內存中許多不同點的值會導致緩存未命中並損害性能。當程序執行時,它實際上是從內存加載到類似於L1緩存的小塊中的CPU中?我問,因爲大概隨後在內存中經常跳轉會導致這個緩存失誤並且損害性能。所以我想這是兩個問題:是否存在這樣的「執行緩存」,並且經常跳到頻繁受傷的性能。由於緩存問題,在程序中跳來跳去是否會損害性能

P.S.除了性能和緩存之外,還不確定適合的標籤是什麼。

P.P.S.一個示例情況可能是包含大量嵌套if s和else s的其他緊密循環,其中每個if和else嵌套底部的最終結果只是少量代碼。

+0

除非你需要你的代碼變得非常快速,否則你可能不需要擔心緩存未命中。有更簡單的方法來優化您的程序。 – Jonathan 2012-04-19 17:15:00

+0

對於我的99.9%的代碼,我不在乎這一點。這隻與少數罕見但關鍵的部分相關,這些部分確實需要非常快速,而如何快速處理大量相關性較高的高性能案例是我目前面臨的問題。 – 2012-04-19 17:33:08

回答

3

是的。這個緩存被稱爲指令緩存。耗盡它會對性能產生嚴重影響。這是內聯功能並不總是有益的原因。內聯函數將會更快,但臃腫的代碼大小可能會驅動I-cache中的熱路徑。

Linux內核deverlopers郵件列表對此主題進行了有趣的討論。

+0

因此,在您的示例中,您的意思是頻繁調用內聯函數可能會減慢代碼速度,因爲經常調用的小函數將加載到指令高速緩存中並保留在那裏,而不是將代碼作爲內聯函數膨脹,導致緩存未命中,因爲內聯函數正在多處加載到指令緩存中。正確? – 2012-04-19 17:27:20

+0

指令緩存現在可能有多大?(例如,如果我正確記得的話,最後我知道我認爲16K和4M對於L1和L2緩存的正確數量級大概是?)? – 2012-04-19 17:34:49

+0

@JohnRobertson我無法理解你的第一句話;-)太長,太嵌套。我試圖說,將非常冷的函數內聯可能會損害性能,因爲熱代碼可能會從緩存中被逐出。內聯(最經常)創建CPU指令。你越頻繁地從同一個程序中獲得更多的指令。出於同樣的原因,編譯器支持優化大小。我的Core i7的I-cache大小爲32kb。它很小。不知道發送一個UDP數據包是否會完全停留在緩存中。 – usr 2012-04-19 17:38:13

相關問題