memcpy所花费的时间在某一点之后会减少

时间:2012-04-02 11:14:01

标签: c malloc memcpy

我有一个代码,它会以指数方式增加内存的大小(由指针标识) 我使用realloc()后跟malloc() ...

而不是memcpy()
int size=5,newsize;
int *c = malloc(size*sizeof(int));
int *temp;

while(1)
{
   newsize=2*size;
   //begin time
   temp=malloc(newsize*sizeof(int));
   memcpy(temp,c,size*sizeof(int));
   //end time
   //print time in mili seconds
   c=temp;
   size=newsize;
}

因此,复制的字节数呈指数级增长。

此任务所需的时间也随着尺寸的增加而几乎呈线性增加。然而,在某一点之后,所花费的时间会突然减少到非常小的值,然后保持不变。

我记录了类似代码的时间,复制了我自己类型的数据。

5 -> 10  - 2 ms  
10 -> 20  - 2 ms  
.  
.  
2560 -> 5120 - 5 ms  
.  
.  
20480 -> 40960 - 30 ms  
40960 -> 91920 - 58 ms  
367680 -> 735360 - 2 ms  
735360 -> 1470720 - 2 ms  
1470720 -> 2941440 - 2 ms

这种时间下降的原因是什么?当大小很大时,是否会调用更优的memcpy方法?

2 个答案:

答案 0 :(得分:6)

由于您的代码在旧内存块上没有free(),因此请确保新分配不会开始失败。当给出一个NULL指针时,可能会出现memcpy()错误,从而很快完成。

答案 1 :(得分:2)

您是否检查了malloc的返回值?

我认为它在某一点之后才会失败。