memcpy所需的时间在某一点后开始减少

4

我有一段代码,可以按指针指向的内存指数级增加大小。
我使用malloc()函数和memcpy()函数代替realloc()函数...

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个回答

6
由于您的代码没有在旧内存块上执行free(),因此请确保新分配的内存块不会开始失败。可能是当给出一个空指针时,memcpy() 会报错,因此会非常快地完成。

1
将5倍增几次(或者像问题中展示的那样无限倍增),确实会非常快地得到荒谬的大数值。无论你释放多少内存,你都很快会达到允许的最大块大小,迫使malloc也要非常快速地返回。 - TheBlastOne
谢谢。这可能是原因,我需要检查一下。 - tss

2

你有检查过malloc的返回值吗?

我认为它在某个点后就会失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接