如何利用cache
code
- 把一起使用的代碼放在有一塊比吭,把經(jīng)常使用的代碼放在一塊逞怨;這里的“一起使用”是指翻譯之后的捌省,即匯編代碼要在一塊,通常情況下互订,匯編代碼是和源代碼差不多順序的吱肌。
- 把不常用到的代碼,比如異常處理放在代碼(函數(shù))的最后仰禽,或者另外使用一個(gè)函數(shù)氮墨。
- 對(duì)于跨文件的情況, 比如子類(lèi)一個(gè)文件吐葵,父類(lèi)一個(gè)文件规揪,有時(shí)候子類(lèi)的函數(shù)和父類(lèi)的函數(shù)要一塊執(zhí)行,所以我們最好在link的時(shí)候把他們組織在一塊温峭;
怎么組織呢猛铅,通常來(lái)講文件link的順序就是他們?cè)趍akefile中出現(xiàn)的順序》锊兀可以通過(guò)查找map file 來(lái)看每個(gè)函數(shù)在內(nèi)存的什么位置奸忽。
Variable
函數(shù)中用到的變量要在函數(shù)中聲明,因?yàn)楹瘮?shù)中聲明的變量(非動(dòng)態(tài)分配的內(nèi)存)是放在堆棧中的揖庄,我們知道堆棧中的數(shù)據(jù)是連續(xù)的栗菜,這給我們cache提供了良好的數(shù)據(jù)結(jié)構(gòu)(動(dòng)態(tài)分配的內(nèi)存不是放在堆棧中,而是分布在內(nèi)存的各個(gè)部分)抠艾。
面向?qū)ο笳Z(yǔ)言可以很好的組織數(shù)據(jù)苛萎,因?yàn)橐粋€(gè)對(duì)象里的數(shù)據(jù)肯定是連續(xù)存放的。
-
如果我們循環(huán)訪問(wèn)多個(gè)數(shù)組的相同位置检号,我們我們可以重新組織數(shù)據(jù),時(shí)期訪問(wèn)連續(xù)蛙酪。重新組織的方法有兩個(gè):合并數(shù)組和使用structa齐苛。
例如:如下代碼訪問(wèn)a、b數(shù)組int Func(int); const int size = 1024; int a[size], b[size], i; ... for(i=0; i<size; i++){ b[i] = Func(a[i]); }
上述代碼訪問(wèn)a和b數(shù)組的對(duì)應(yīng)位置桂塞。為了使訪存連續(xù)凹蜂,我們可以利用struct來(lái)組織數(shù)據(jù)結(jié)構(gòu),聲明struct不會(huì)有額外消耗。
int Func(int); const int size = 1024; struct Sab {int a; int b}; Sab ab[size]; int i; ... for(i=0; i<size; i++){ ab[i].a = Func(ab[i].b); }
上面代碼有三個(gè)好處:(1) 數(shù)據(jù)訪問(wèn)時(shí)連續(xù)的; (2) 聲明struct不會(huì)產(chǎn)生額外的開(kāi)銷(xiāo); (3) 程序只需訪問(wèn)一個(gè)數(shù)組而不是兩個(gè)玛痊。
然后經(jīng)過(guò)我的測(cè)試汰瘫,上述代碼不會(huì)并沒(méi)有產(chǎn)生性能提升。擂煞。混弥。。
-
如果我們可以根據(jù)條件選擇不同的數(shù)據(jù)類(lèi)型对省,我們可以使用union來(lái)節(jié)省一半空間蝗拿。如下所示:
void F1(int x[]); void F2(float x[]); void F3(bool y) { if (y) { int a[1000]; F1(a); } else { float b[1000]; F2(b); } }
我們到a 和 b 數(shù)組只能用一個(gè),所以用union可以更節(jié)省空間蒿涎。
void F3(bool y) { union { int a[1000]; float b[1000]; }; if (y) { F1(a); } else { F2(b); } }