Вот еще один быстрый и интересный, если не научно надежный и недостаточно продуманный тест:
char *memory;
NSLog (@"Start heap allocs");
for (int allocations = 0; allocations < 100000000; allocations++)
{
memory = malloc (1024);
memory[0] = 1;
memory[1023] = memory[0] + 1;
free(memory);
}
NSLog (@"End heap allocs");
NSLog (@"Start stack allocs");
for (int allocations = 0; allocations < 100000000; allocations++)
{
char memory2 [1024];
memory2[0] = 1;
memory2[1023] = memory2[0] + 1;
}
NSLog (@"End stack allocs");
и вывод:
2011-02-12 11:46:54.078 Veg Met Chilli[4589:207] Start heap allocs
2011-02-12 11:47:06.759 Veg Met Chilli[4589:207] End heap allocs
2011-02-12 11:47:06.759 Veg Met Chilli[4589:207] Start stack allocs
2011-02-12 11:47:07.057 Veg Met Chilli[4589:207] End stack allocs
Выполняйте математику самостоятельно, но это позволяет распределять кучу примерно в 42 раза дольше. Я должен подчеркнуть, что не цитируйте меня, в этом обязательно будут недостатки! В частности, относительное время, необходимое для фактического назначения значений в данных.
РЕДАКТИРОВАТЬ: новые данные испытаний.
Так что теперь я просто вызываю метод для каждого выделения кучи и стека, а не помещаю их сразу в цикл. Результаты:
2011-02-12 12:13:42.644 Veg Met Chilli[4678:207] Start heap allocs
2011-02-12 12:13:56.518 Veg Met Chilli[4678:207] End heap allocs
2011-02-12 12:13:56.519 Veg Met Chilli[4678:207] Start stack allocs
2011-02-12 12:13:57.842 Veg Met Chilli[4678:207] End stack allocs
Это позволяет распределять кучи только в 10 раз больше, чем выделяет стек.
Чтобы сделать результаты более точными, у меня также должен быть метод контроля, который не выделяет память (но, по крайней мере, делает что-то, чтобы не оптимизироваться), и отнимаю это время. Я сделаю это дальше ...
РЕДАКТИРОВАТЬ: Верно ...
Теперь код выглядит так:
int control = 0;
NSLog (@"Start heap allocs");
for (int allocations = 0; allocations < 100000000; allocations++)
{
control += [self HeapAlloc];
}
NSLog (@"End heap allocs");
NSLog (@"Start stack allocs");
for (int allocations = 0; allocations < 100000000; allocations++)
{
control += [self StackAlloc];
}
NSLog (@"End stack allocs");
NSLog (@"Start no allocs");
for (int allocations = 0; allocations < 100000000; allocations++)
{
control += [self NoAlloc];
}
NSLog (@"End no allocs");
NSLog (@"%d", control);
-(int) HeapAlloc
{
int controlCalculation = rand();
char *memory = malloc (1024);
memory[0] = 1;
memory[1023] = memory[0] + 1;
free(memory);
return controlCalculation;
}
-(int) StackAlloc
{
int controlCalculation = rand();
char memory [1024];
memory[0] = 1;
memory[1023] = memory[0] + 1;
return controlCalculation;
}
-(int) NoAlloc
{
int controlCalculation = rand();
return controlCalculation;
}
и результаты:
2011-02-12 12:31:32.676 Veg Met Chilli[4816:207] Start heap allocs
2011-02-12 12:31:47.306 Veg Met Chilli[4816:207] End heap allocs
2011-02-12 12:31:47.306 Veg Met Chilli[4816:207] Start stack allocs
2011-02-12 12:31:49.458 Veg Met Chilli[4816:207] End stack allocs
2011-02-12 12:31:49.459 Veg Met Chilli[4816:207] Start no allocs
2011-02-12 12:31:51.325 Veg Met Chilli[4816:207] End no allocs
Таким образом, контрольное время составляет 1,866 секунды.
Уберите это из выделенного времени:
стек 0,286 секунды
куча 12,764 секунды
Таким образом, выделение кучи занимает в 45 раз больше времени, чем выделение стека.
Спасибо и спокойной ночи! :)