我們先看一個例子:
有這么兩個程序:它們的目的就是將數組x中的數,按照下標累加到數組y中,最后在把數組y中的數據累加到一個數dest里面。為了驗證效果,我們將這個過程重復10000遍。
Prog 1 Prog2
這兩個程序的區別就在Prog2中紅框里面的內容。那么哪個程序運行的更快呢?
話不多說,我們看實際的結果:
這里為了說明效果,我們編譯的時候,并沒有采用優化(編譯優化,確實可以提高程序運行的效率,但是過高的編譯優化等級會有一定的副作用,另外編譯器優化也具有一定的局限性,高效的代碼仍然應該是我們追求的目標)。可以看到,Prog2要明顯比Prog1快。
要想理解上面的例子,我們必須先介紹一下寄存器和匯編代碼的相關知識:
寄存器
CPU內部用來存放數據的一些小型存儲區域, 注意寄存器是在CPU內部,受限于CPU的物理尺寸,寄存器數量不會太多。我們只需要記住兩點:
1) 寄存器和CPU的L1 cache相比,速度雖然還在一個數量級,但是L1 cache的訪問速度還是要慢幾倍。具體的數據見下文表2
2) CPU只能從寄存器直接取數據或者指令,如果取不到,獲取的順序是L1-》L2-》L3-》主存-》磁盤。
從下文表2中可以看出,如果cpu的cache訪問miss了,性能損失還是很大的。如果內存里面再miss了,那對性能來說不亞于一場災難了。
計算機訪問速度分級:
表1 時間單位
以3.3GHz的CPU為例:
表2 系統的各種延時
正如你所見,CPU周期的時間非常短,這段時間,光的速度大約只能走0.5米。想象一下,是不是非常震撼?
x86-64 CPU的整數寄存器:
我們無需刻意去記住這些寄存器的名稱,不同架構的寄存器的數量和名稱也不一樣,我們只要知道他們是cpu內部的效率極高的存儲單元即可。
回到前面的例子,為什么Prog2要比Prog1快,是因為Prog2里面用DEST這個局部變量代替了dest。DEST是一個局部變量,在匯編指令里是直接訪問寄存器,而dest則需要去訪問內存cache。
-
寄存器
+關注
關注
31文章
5363瀏覽量
120915 -
cpu
+關注
關注
68文章
10899瀏覽量
212615 -
內存
+關注
關注
8文章
3047瀏覽量
74207 -
程序
+關注
關注
117文章
3794瀏覽量
81281
發布評論請先 登錄
相關推薦
評論