我有一個函數如下:測量高速緩存的大小用C
int doSomething(long numLoop,long arraySize){
int * buffer;
buffer = (int*) malloc (arraySize * sizeof(int));
long k;
int i;
for (i=0;i<arraySize;i++)
buffer[i]=2;//write to make sure memory is allocated
//start reading from cache
for(k=0;k<numLoop;k++){
int i;
int temp
for (i=0;i<arraySize;i++)
temp = buffer[i];
}
}
它所要做的就是聲明數組,並從開始到結束閱讀。目的是看看緩存的效果。 我期望看到的是:當我調用doSomething(10000,1000)時,arraySize很小,因此它全部存儲在緩存中。之後,我調用doSomething(100,100000),arraySize大於緩存的大小。因此,第二次函數調用應比第一次調用花費更長的時間。後一個函數調用涉及一些內存訪問,因爲整個數組不能存儲在緩存中。 但是,第2次手術似乎與第1次手術大致相同。那麼這裏有什麼問題?我試圖用-O0進行編譯,但它不能解決問題。 謝謝。
更新1:這些都是隨機訪問的代碼,它似乎工作,與大陣的時間訪問〜15秒,而小陣是〜3秒
int doSomething(long numLoop,int a, long arraySize){
int * buffer;
buffer = (int*) malloc (arraySize * sizeof(int));
long k;
int i;
for (i=0;i<arraySize;i++)
buffer[i]=2;//write to make sure memory is allocated
//start reading from cache
for(k=0;k<numLoop;k++){
int temp;
for (i=0;i<arraySize;i++){
long randnum = rand();//max is 32767
randnum = (randnum <<16) | rand();
if (randnum < 0) randnum = -randnum;
randnum%=arraySize;
temp = buffer[randnum];
}
}
}
這個問題是非常相似的http://stackoverflow.com/q/12548651/841108 –
考慮到你的啓動你的緩衝區一個for()循環,實際上數組越大,啓動緩衝區所用的時間就越長。我認爲你是完全誤導人的。 –