为什么malloc+memset比calloc慢?

为什么malloc+memset比calloc慢?

大家都知道callocmalloc它初始化分配的内存。带着calloc,内存设置为零。带着malloc,内存未清除。

所以在日常工作中,我认为callocmalloc+memset..顺便说一句,为了好玩,我为基准测试编写了以下代码。

结果令人困惑。

代码1:

#include<stdio.h>#include<stdlib.h>#define BLOCK_SIZE 1024*1024*256int 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*256int 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

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

我的问题是:为什么malloc+memsetcalloc?怎么能calloc这么做?


慕尼黑8549860
浏览 1062回答 3
3回答

largeQ

因为在许多系统上,在空闲的处理时间里,操作系统会自行将空闲内存设置为零,并将其标记为安全。calloc()所以当你打电话calloc(),它可能已经有了免费的零内存给你。

森林海

在某些平台上,在某些模式下,malloc在返回内存之前将内存初始化为一些典型的非零值,因此第二个版本很可能会对内存进行两次初始化。
打开App,查看更多内容
随时随地看视频慕课网APP