0

我正在开发一个使用 Calloc() 计时内存分配的程序,该程序应该尝试分配 50megs 并每次迭代 50megs,直到它分配 1500megs 的 ram。createbigthing() 的目标只是创建一些大的东西并释放它。

....
#define oneMeg 1024L*1024L
#define INCREMENT 50

int difftod(struct timeval * tv0, struct timeval * tv1){
return (tv1->tv_sec - tv0->tv_sec)*1000 + (tv1->tv_usec- tv0->tv_usec)/1000;
}


int createbigthing(long int size){

int *test = (int*) calloc(size, (size_t) oneMeg);
if(test == NULL){
    return -1;
}

free(test);
return 0;
}


int main(){
long int i;
int rtn;
struct timeval tv0, tv1;
struct timezone tzp;
for(i=INCREMENT;i<=1500;i=i+INCREMENT){
        rtn = gettimeofday(&tv0, &tzp); /* set timer T0 */
        createbigthing(i);
    rtn = gettimeofday(&tv1, &tzp); /* read time T1 */
    printf("%d msec\n",difftod(&tv0,&tv1));
}
return 0;
}

我得到的唯一输出是第一次迭代给了我大约 220 毫秒的延迟,然后什么也没有,函数仍然返回 0,所以内存不应该是满的。

输出示例:

220 msec
0 msec
0 msec
0 msec
0 msec
...
4

1 回答 1

0

这完全是预期的行为:

  • 您从系统内核请求一个兆字节一次(在内部calloc()),这需要时间(但它不应该是 220 毫秒)。

  • 你释放这个内存,告诉 libc(不是内核)你不再需要它了。在大多数情况下,libc 不会将内存返回给系统,因此它仍然是您的虚拟地址空间的一部分。

  • 你再次告诉 libc,你需要一兆字节的 RAM,而 libc 说:哦,太好了,我这里还有一个合适的大块。拿着!它也会删除其内容,因为您使用calloc(),但这不会花费毫秒范围内的时间。

另请注意,您的时差代码将舍入低于一毫秒的任何时差。您可能希望将其更改为打印经过的微秒。

于 2013-07-25T11:45:55.317 回答