c - 在 C 中测量缓存大小

标签 c caching

我有一个函数如下:

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 比缓存的大。因此,第二次函数调用的时间应该比第一次长。后一个函数调用涉及一些内存访问,因为整个数组不能存储在缓存中。 但是,似乎第二次操作与第一次操作花费的时间大致相同。那么这里出了什么问题?我尝试使用 -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];
            }
    }
}

最佳答案

您正在按顺序访问数组,

for (i=0;i<arraySize;i++)           
    temp = buffer[i];

因此您正在访问的部分将始终在缓存中,因为该模式很难预测。要查看缓存效果,您必须以不可预测的顺序访问数组,例如通过生成(伪)随机索引,以便您在数组的前端和后端之间跳转。

关于c - 在 C 中测量缓存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12663629/

相关文章:

.net - HttpClient 在服务器上启用缓存

cakephp - 缓存引擎默认配置不正确

asp.net - 缓存策略、css/js/images 如何让它们在我每次完全回发时不加载?

caching - 在 Symfony 2 中,是否有使用 read() 和 write() 方法与应用程序/缓存缓存交互的好方法?

c - 将 Visual C 链接到 MinGW 静态库

c - strtok 表现出不良行为

c - ioctl KVM_RUN 在什么情况下返回?

c++ - volatile 限定符是否取消了此内存的缓存?

c - C 代码中 ... 是什么意思

c - 在执行后续代码之前强制执行内存写入