calloc() will use 4993ms (34 times slower).
This only works if you have a process which will build the data structures and after finish of that process you free all memory at once. I.e. not freeing single objects, which I would recommend generally because it frees you from manually doing memory management.
We only have allot(int size) and block_free_all(), allot can?t allocate objects larger than 1M in this example.
?How is this dangerous? why should this dangerous ? It?s probably as dangerous as drinking hot coffee, watch out what you are doing and you are fine.
#include <stdio.h>
#include <stdlib.h>
typedef struct block_t {
struct block_t *next;
char memory[1024*1024];
} block_t;
block_t *blocks;
static void *block_current=0, *block_end=0;
static void block_add(void) {
block_t *b=calloc(1, sizeof(block_t));
b->next=blocks;
blocks=b;
block_current=b->memory;
block_end=b->memory+sizeof(b->memory);
}
void *allot(int size) {
if(block_current+size>=block_end) block_add();
void *mem=block_current;
block_current+=size;
return mem;
}
void block_free_all(void) {
block_t *b=blocks;
while(b) {
block_t *nb=b->next;
free(b);
b=nb;
}
}
int main() {
int i;
for(i=0;i<30000000;i++) allot(30);
block_free_all();
return 0;
}
$ time ./x
real 0m0.144s
user 0m0.128s
sys 0m0.011s