我正在研究一个程序,使用Calloc()计算时间, 该程序应该尝试分配50megs并每次迭代50次meg, 直到它分配了1500兆公羊。 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
...
答案 0 :(得分:0)
这完全是预期的行为:
您从系统内核请求一个Mebibyte(在calloc()
内),这需要时间(但不应该是220毫秒)。
你释放了这个内存,告诉libc(而不是内核)你不再需要它了。在大多数情况下,libc不会将内存返回给系统,因此它仍然是虚拟地址空间的一部分。
你再次告诉libc,你需要一个Mebibyte的RAM,并且libc说:哦,太棒了,我还有一个很合适的块。接受!它也会删除它的内容,因为你使用calloc()
,但这不会花费毫秒的时间。
另请注意,您的时间差分代码将向下舍入低于一毫秒的任何时差。您可能希望将其更改为打印经过的微秒。