ios 優化 cpu緩存與程序內存分佈

今天看了一篇文章,關於CPU Cache的7個示例科普CPU Cache html

忽然發現原來本身不知道的東西有這麼多,翻查了一些資料,學到了好多東西,因此趕忙記下來,之後忘了的時候翻出來看看 程序員

做爲程序員,有必要知道cpu是怎麼拿到數據而後處理數據的,優化程序不少都是從這一點作起,這也是我一直想知道的,以前學計算機組成原理和操做系統,沒怎麼認真學,如今才發現原來這些都是很重要的基礎課,若是一個程序員連本身的代碼是怎麼在機器上運行的都不知道的話,那他就打不出好的代碼。之前也只懵懵懂懂的知道,訪問內存纔會消耗cpu,但根本的都沒去了解,今天算是一口氣解決了本身的好多疑問 shell

首先你得知道cache這個東西,很是有必要了解清楚,特別是概念和起執行的原理,網上搜一下,一大堆 緩存

cache裏的基本存儲單元是cacheline即緩存行,緩存一般分爲一級緩存和二級緩存,有些還有三級緩存,一般數據傳遞路線是硬盤到內存到二級緩存到一級緩存再到cpu寄存器,cpu讀取數據時,首先會先從一級緩存那裏讀取,若是該數據存在的話(即cache命中),直接取出數據,這裏並無訪問內存,若是數據不在一級緩存,cpu就會到二級緩存那裏尋找,一樣,若是存在則直接取出數據,若是不存在,那就得從內存載入該數據了,這時就須要訪問一次內存,緩存就是爲了提升cpu的工做效率。 函數

瞭解系統的內存管理機制也是很重要的,Windows系統爲每一個進程都分配了4g的虛擬內存地址,內核佔了2g,剩餘的空間有棧區、堆區、全局數據區和代碼區等,中間還有其餘的,總結起來就是動態數據區、代碼區和靜態數據區。C++中每一個程序的內存分配爲代碼區、全局數據區、堆區和棧區 測試

C++的內存分配方式有三種: 優化

一、從靜態存儲區域分配 spa

編譯時就分配好,運行期間一直存在,如全局變量、靜態變量 操作系統

二、在棧上分配 設計

函數內局部變量,函數執行完後自動釋放,內置於處理器的指令集中,效率很高,內存容量有限

三、在堆上分配(動態內存分配)

malloc或new申請,free或delete釋放

其實對於局部變量,爲什麼效率快呢,比較準確的說法是,局部變量在函數體中被屢次引用時,該變量會被放入到緩存裏,因此每次讀取數據,只要其存在在緩存中就不會去訪問內存,但其實若是你在函數體中對局部變量和靜態變量作一樣次數的引用時,執行時間是同樣長的,幾行代碼就能夠測試出來了

因此程序設計要儘可能知足局部性原理,局部性原理又分爲時間局部性和空間局部性,時間局部性是指若是程序中的某條指令一旦執行,則不久以後該指令可能再次被執行;若是某數據被訪問,則不久以後該數據可能再次被訪問。空間局部性是指一旦程序訪問了某個存儲單元,則不久以後。其附近的存儲單元也將被訪問。附近即具備連續地址 。

關於內存管理的東西還有不少,天天累積一點點,學到了就記下來。

相關文章
相關標籤/搜索