Известно, что calloc
отличается от malloc
тем, что он инициализирует выделенную память. С 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
Замена memset
на bzero(buf[i],BLOCK_SIZE)
в коде 2 дает тот же результат.
Мой вопрос: Почему malloc
+ memset
намного медленнее, чем calloc
? Как это сделать calloc
?