为什么malloc + memset比calloc慢?

时间:2010-04-22 05:40:25

标签: c malloc

众所周知callocmalloc的不同之处在于它初始化分配的内存。使用calloc时,内存设置为零。使用malloc时,内存不会被清除。

因此,在日常工作中,我将calloc视为malloc + memset。 顺便说一句,为了好玩,我为基准编写了以下代码。

结果令人困惑。

代码1:

#include<stdio.h>
#include<stdlib.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
        int i=0;
        char *buf[10];
        while(i<10)
        {
                buf[i] = (char*)calloc(1,BLOCK_SIZE);
                i++;
        }
}

代码1的输出:

time ./a.out  
**real 0m0.287s**  
user 0m0.095s  
sys 0m0.192s  

代码2:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BLOCK_SIZE 1024*1024*256
int main()
{
        int i=0;
        char *buf[10];
        while(i<10)
        {
                buf[i] = (char*)malloc(BLOCK_SIZE);
                memset(buf[i],'\0',BLOCK_SIZE);
                i++;
        }
}

代码2的输出:

time ./a.out   
**real 0m2.693s**  
user 0m0.973s  
sys 0m1.721s  

在代码2中用memset替换bzero(buf[i],BLOCK_SIZE)会产生相同的结果。

我的问题是:为什么malloc + memsetcalloc慢得多? calloc如何做到这一点?

3 个答案:

答案 0 :(得分:428)

答案 1 :(得分:12)

因为在许多系统上,在备用处理时间内,操作系统会自行将可用内存设置为零并标记为calloc()安全,因此当您调用calloc()时,它可能已经有给你的免费,归零记忆。

答案 2 :(得分:1)

在某些模式的某些平台上,malloc在返回之前将内存初始化为某些通常为非零的值,因此第二个版本可以很好地初始化内存两次