Уптимизирвал тут уптимизации, подумалось локальность данных улокалить, а чёб нет.
Пример, скорости мытья 400000000 тарелок
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc, char *argv[])
{
uint32_t len = 20000;
#ifdef Villabajo
uint32_t ** mem_a = malloc(sizeof(uint32_t *) * len);
for (int i = 0; i < len; ++i)
{
mem_a[i] = malloc(sizeof(uint32_t) * len);
for (int j = 0; j < len; j++)
{
mem_a[i][j]=j;
}
}
#endif
#ifdef Villaribo
uint32_t * mem_b = malloc(sizeof(uint32_t)*(len*len));
uint32_t ** mem_c = malloc(sizeof(uint32_t*)*len);
for (int i = 0; i < len; ++i)
{
mem_c[i] = mem_b+len*i;
for (int j = 0; j < len; j++)
{
mem_c[i][j]=j;
}
}
#endif
return 0;
}
dron@gnu:~$ gcc gg.c -O0 -DVillabajo -o Villabajo && time ./Villabajo
real 0m3,499s
user 0m2,602s
sys 0m0,876s
dron@gnu:~$ gcc gg.c -O0 -DVillaribo -o Villaribo && time ./Villaribo
real 0m2,737s
user 0m2,160s
sys 0m0,561s
dron@gnu:~$
Странно что раньше как то в голову не приходило мне. Есть конечно минус в том что память не разделена как бы и всё от этого вытекающее, но в остальном только вроде плюсы.