ios 優化 cpu快取與程式記憶體分布

2021-06-18 18:30:57 字數 1281 閱讀 2065

今天看了一篇文章,關於cpu cache的7個示例科普cpu cache

突然發現原來自己不知道的東西有這麼多,翻查了一些資料,學到了好多東西,所以趕緊記下來,以後忘了的時候翻出來看看

作為程式設計師,有必要知道cpu是怎麼拿到資料然後處理資料的,優化程式很多都是從這一點做起,這也是我一直想知道的,之前學計算機組成原理和作業系統,沒怎麼認真學,現在才發現原來這些都是很重要的基礎課,如果乙個程式設計師連自己的**是怎麼在機器上執行的都不知道的話,那他就打不出好的**。以前也只懵懵懂懂的知道,訪問記憶體才會消耗cpu,但根本的都沒去了解,今天算是一口氣解決了自己的好多疑問

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

cache裡的基本儲存單元是cacheline即快取行,快取通常分為一級快取和二級快取,有些還有**快取,通常資料傳遞路線是硬碟到記憶體到二級快取到一級快取再到cpu暫存器,cpu讀取資料時,首先會先從一級快取那裡讀取,如果該資料存在的話(即cache命中),直接取出資料,這裡並沒有訪問記憶體,如果資料不在一級快取,cpu就會到二級快取那裡尋找,同樣,如果存在則直接取出資料,如果不存在,那就得從記憶體載入該資料了,這時就需要訪問一次記憶體,快取就是為了提高cpu的工作效率。

了解系統的記憶體管理機制也是很重要的,windows系統為每個程序都分配了4g的虛擬記憶體位址,核心佔了2g,剩餘的空間有棧區、堆區、全域性資料區和**區等,中間還有其他的,總結起來就是動態資料區、**區和靜態資料區。c++中每個程式的記憶體分配為**區、全域性資料區、堆區和棧區

c++的記憶體分配方式有三種:

1、從靜態儲存區域分配

編譯時就分配好,執行期間一直存在,如全域性變數、靜態變數

2、在棧上分配

函式內區域性變數,函式執行完後自動釋放,內置於處理器的指令集中,效率很高,記憶體容量有限

3、在堆上分配(動態記憶體分配)

malloc或new申請,free或delete釋放

其實對於區域性變數,為何效率快呢,比較準確的說法是,區域性變數在函式體中被多次引用時,該變數會被放入到快取裡,所以每次讀取資料,只要其存在在快取中就不會去訪問記憶體,但其實如果你在函式體中對區域性變數和靜態變數做同樣次數的引用時,執行時間是一樣長的,幾行**就可以測試出來了

所以程式設計要盡量滿足區域性性原理,區域性性原理又分為時間區域性性和空間區域性性,時間區域性性是指如果程式中的某條指令一旦執行,則不久之後該指令可能再次被執行;如果某資料被訪問,則不久之後該資料可能再次被訪問。空間區域性性是指一旦程式訪問了某個儲存單元,則不久之後。其附近的儲存單元也將被訪問。附近即具有連續位址

。關於記憶體管理的東西還有很多,每天累積一點點,學到了就記下來。

iOS快取 記憶體快取

為了減少與伺服器的連線溝通次數,提高應用程式的執行速度,使用了ios的快取機制 import youngviewcontroller.h inte ce youngviewcontroller end implementation youngviewcontroller void viewdidlo...

iOS快取 記憶體快取

為了減少與伺服器的連線溝通次數,提高應用程式的執行速度,使用了ios的快取機制 import youngviewcontroller.h inte ce youngviewcontroller end implementation youngviewcontroller void viewdidlo...

iOS 記憶體快取

使用快取的目的是為了使用的應用程式能更快速的響應使用者輸入,是程式高效的執行。有時候我們需要將遠端web伺服器獲取的資料快取起來,減少對同乙個url多次請求。記憶體快取我們可以使用sdk中的nsurlcache類。nsurlrequest需要乙個快取引數來說明它請求的url何如快取資料的,我們先看下...