malloc与realloc一个案例测试

在编写缓存的过程中,经常会遇到以下问题:是事先分配一段足够的大内存好,还是临时增加的好呢?我们一般认为事先分配足够大的内存是用空间换时间,以换取更高的性能,临时增加内存容量是用时间换空间,以换取内存更高的利用率,本篇对比测试的目的主要是测试看看两种的性能差距的具体量值。

下面是本次测试的代码:

void testmalloc()
{
	long long  nsize=64*1024*1024;	
	//第一部分
	time_t begint=GetTickCount();	
	char* p1=(char*)malloc(nsize);
	memset(p1,0,nsize);
	long long double_nsize=nsize*2;	
	char* p2=(char*)malloc(double_nsize);
	memset(p2,0,double_nsize);
	memcpy(p2,p1,nsize);
	free(p1);
	time_t endint=GetTickCount();	
	printf("new malloc time is %d\n",endint-begint);
	free(p2);	
	
	//第二部分
	begint=GetTickCount();	
	char* p3=(char*)malloc(double_nsize);
	memset(p3,0,double_nsize);
	endint=GetTickCount();	
	printf("big malloc time is %d\n",endint-begint);
	free(p3);

	//第三部分
	begint=GetTickCount();
	char* p5=NULL;
	char* p4=(char*)malloc(nsize);	
	memset(p4,1,nsize);
	if (double_nsize>nsize)
	{
		//p5=(char*)realloc(p4,double_nsize);
		p5=(char*)realloc(p4,nsize+1024*3);
		if (!p5)
		{
			return;
		}
	}
	endint=GetTickCount();	
	printf("befor %p,after %p,realloc time is %d\n",p4,p5,endint-begint);
	free(p5);

}
第一部分模拟先分配的内存不够,再次增加内存的业务背景:先申请一个小内存块,在申请一个大内存块,将先前申请的内存块的内容copy到大内存块;
第二部分是直接申请一个大内存块;
第三部分和第一部分意思相同,只不过用效率更高的realloc来实现。

1、经过对比测试发现,第一部分的代码效率最低,现在我们只分析第二部分和第三部分代码
当realloc中的size大小增加不多时(nsize+1024*1024*n,n<32),即使触发了realloc新建内存时,第三部分代码的效率无论在资源利用率和时间都占优;但当新增内存过大的n>32时,第二部分和第三部分的结果不分仲伯,同在一个数据量级,耗时相差时上时下。
2、对上次结果经过分析,memset耗时比较大,初始化大内存时可能比较耗时,现在注释memset,经过测试对比发现若realloc未触发新建内存时第三部分代码的效率无论在资源利用率和时间都占优,当需要的增加内存增大时,迫使realloc新建内存时(发生内存copy,消耗等操作),则第二部分耗时占优。

结论:memset初始化内存耗时较多,对性能有严格的要求,可不用memset初始化内存,但要严格控制内存的边界问题。
如果申请使用内存大小在0~2*size之间,若预判大部分情况下可能使用在小于size或在size上下时,可初始化内存块为size,使用realloc来扩展少部分内存时,效率比较高,当无法预判则可使用malloc来申请一个大内存,但不要初始化,否则耗时比按需增加要高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mallocrealloc都是C语言中用于动态内存分配的函数。 malloc函数用于分配指定大小的内存块,并返回一个指向该内存块起始位置的指针。它的函数原型如下: ``` void* malloc(size_t size); ``` 其中,size_t是一个无符号整数类型,表示要分配的字节数。如果内存分配成功,则返回指向分配的内存块的指针;如果分配失败,则返回NULL。 realloc函数用于重新分配之前使用malloc或calloc函数分配的内存块的大小。它的函数原型如下: ``` void* realloc(void* ptr, size_t size); ``` 其中,ptr是一个指向之前分配的内存块的指针,size是需要重新分配的字节数。realloc函数将会尝试重新分配ptr指向的内存块,如果成功,则返回指向重新分配后内存块起始位置的指针;如果失败,则返回NULL。需要注意的是,如果realloc函数失败,则原来分配的内存块仍然有效,不会被释放。 两者的主要区别在于: 1. malloc函数只能用于内存的初始分配,而realloc函数可以用于动态调整内存块的大小; 2. realloc函数在重新分配内存时,会尽量保留之前分配的内容。如果新的大小大于之前分配的大小,那么额外的内存空间可能是未初始化的; 3. realloc函数的第一个参数是之前分配的内存块的指针,而malloc函数不需要传入这个参数。 总的来说,mallocrealloc都是用于动态内存分配的函数,但malloc只能用于初始分配,而realloc可以用于动态调整内存块的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值