C C 序列程式優化 提高記憶體讀寫效率

2021-09-02 07:35:25 字數 1225 閱讀 9519

作業系統使得計算機硬體對程式設計師透明,即程式設計師在寫**時不用考慮機器到底如何工作。但是了解cpu內快取記憶體的作用能幫助程式設計師設計出更高效的**。下面簡單介紹一下cpu內的快取記憶體和程式優化方法

計算機中cpu的工作頻率(2-4ghz)高於記憶體的工作頻率(1-2ghz)。

但是程式執行時cpu需要從記憶體中不斷讀入資料,如果cpu直接從記憶體中讀資料,需要保持和記憶體同樣的頻率,會大大損失cpu的效能。cpu內部的快取記憶體(sdram)就是為了解決這個問題而設計的乙個很小的快取記憶體區,cpu可以快速地從快取記憶體中讀取資料,而快取記憶體則以較慢的速度批量讀取記憶體中的資料,這樣可降低cpu效能的損失。但如果快取記憶體中沒有cpu需要的資料,快取記憶體就要再從記憶體中讀一次資料。

因此如果快取記憶體每次從記憶體中讀取的資料被cpu利用率(cpu的命中率)越大,那麼cpu做同樣次數運算快取記憶體從記憶體中讀取資料的次數越少,資料讀取消耗時間越少,cpu的效能降低越小;反之快取記憶體從記憶體讀取資料的次數越多,資料讀取消耗時間越多,cpu效能降低越大。

因此要使得程式效率提高,就需要讓cpu的命中率越大。通常快取記憶體從記憶體中讀取資料為連續讀取。我們可以比較下面兩段**:

for(unsigned int i = 0; i < n; ++i) 

}}for(unsigned int i = 0; i < n; ++i) }}

這是乙個矩陣相乘的**。上面一段**j的迴圈在最裡層,k的迴圈在中間層;下面一段**k的迴圈在最裡層,j的迴圈在中間層。

我們發現總是上面的**執行速度要快一些。因為當j在迴圈最裡層時,可以在n次計算裡cpu每次計算僅j不同,cpu只用訪問c的一段連續記憶體。而當k在迴圈最裡層時,cpu不僅要訪問b的一段連續記憶體,還要訪問c的不連續記憶體

。因此上面的**的cpu命中率要高於下面的**。下面的**比上面的**在記憶體讀取上要多花一些時間,使得執行時間增長。

要提高程式記憶體讀寫的效率,因為有快取記憶體的存在,我們需要提高cpu的命中率,這需要在程式中盡可能地讓cpu連續地訪問記憶體,盡量避免跳躍地訪問記憶體

斐波那契序列程式優化

最近在看高德納的 計算機程式設計藝術 其中看到了斐波那契序列。用 實現序列非常簡單,程式如下 public static int x int a switch a 執行程式,序列資料執行也沒有問題,然而,將a值設定為50以上之後,發現執行速度非常慢。原因是在遞迴呼叫的過程中,大量的重複計算。因為是重...

如何提高matlab執行程式

最近在執行幾個用matlab編的大型計算程式,基本上執行乙個人的資料需要50個小時,總共有120個人,怕是不進行優化的話,等執行完我就畢業了,所以寫篇部落格,立志將其時間縮短到 先看,先看,也不知道能提高多少,優化進度會在此說明。優化1 矩陣空間預分配 提前設定好已知矩陣空間的矩陣大小,確實有用 0...

c c 程式優化幾個建議

第一 記住,寫完後一定要做一下系統優化,無論上面是否這樣要求,但是這點很重要,是一種態度,當然優化可以借助各種工具如ibm和intel系列的優化工具,一般80 的時間被20 的 所占用。第二 如果你所在公司,對程式效能優化不重視,那麼就請跳槽吧。第三 要知道你所用編譯器是怎麼去優化多維陣列訪問的,如...