LINUX.ORG.RU

Двумерный массив из одномерного - ван секонд фастер вжуух.

 , , , ,


1

2

Уптимизирвал тут уптимизации, подумалось локальность данных улокалить, а чёб нет.

Пример, скорости мытья 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:~$ 

Странно что раньше как то в голову не приходило мне. Есть конечно минус в том что память не разделена как бы и всё от этого вытекающее, но в остальном только вроде плюсы.

Ответ на: комментарий от a--
  1. емнип на х86 указатели могут быть нечетными

там free! а хипменеджер не дает нечетные указатели. то есть я даже нечетный ему подложил, пытаясь громко намекнуть об ошибке… ему все равно. это если вы утверждаете, что gcc понимает в семантику предопределенных функций

alysnix ★★★
()
Ответ на: комментарий от alysnix

тут маллок не причем совсем. можешь попробовать его заменить некой функцией void* hren_alloc(int fsize) и вызвать ее. он должен тоже выкинуть два хреналока. и два free. потому что оптимизация тут в другом месте. проверяй.

Проверил. Не выкидывает.

utf8nowhere ★★★
()
Ответ на: комментарий от alysnix
  1. емнип на х86 указатели могут быть нечетными

там free! а хипменеджер не дает нечетные указатели. то есть я даже нечетный ему подложил, пытаясь громко намекнуть об ошибке… ему все равно. это если вы утверждаете, что gcc понимает в семантику предопределенных функций

Понимает не полностью == полностью не понимает?

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Ответ на: комментарий от alysnix

то есть я даже нечетный ему подложил, пытаясь громко намекнуть об ошибке… ему все равно

да, он такой; все что не относится к оптимизации — например, ошибки программиста — интересует его очень мало

это дефект дизайна С и С++

но ты можешь написать плагин clang или поискать готовый для реализации своих варнингов

a--
()
Ответ на: комментарий от alysnix

впрочем, кое-что gcc понимает:

#include <stdlib.h>

int main()
{
  int a=1;
  free (&a);
  return 0;
}

free3.c:6:12: warning: attempt to free a non-heap object ‘a’ [-Wfree-nonheap-object]
a--
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.