История изменений
Исправление agentgoblin, (текущая версия) :
любой твой цикл должен быть 0.2 секунды или меньше
Просто добавь printf
или return
c mem_X
в конце каждого примера. Иначе с -O2 и -O3 компилятор выкидывает все эти циклы и выделения памяти в топку как неиспользуемые, после чего скорость исполнения вырастает аж до 0,002s. В ассемблерном листинге можешь убедиться в этом (gcc -S).
Вариант с return mem_a[len-1][len-1];
:
$ gcc mallocs20k.c -O2 -DVillabajo -o Villabajo && time ./Villabajo
real 0m0,661s
user 0m0,144s
sys 0m0,515s
$ gcc mallocs20k.c -O3 -DVillabajo -o Villabajo && time ./Villabajo
real 0m0,559s
user 0m0,056s
sys 0m0,502s
В другой деревне с return mem_b[(len*len)-1];
:
$ gcc mallocs20k.c -O2 -DVillaribo -o Villaribo && time ./Villaribo
real 0m0,574s
user 0m0,132s
sys 0m0,441s
$ gcc mallocs20k.c -O3 -DVillaribo -o Villaribo && time ./Villaribo
real 0m0,627s
user 0m0,096s
sys 0m0,530s
Ryzen 5 2600 + DDR4 2666 + Ubuntu 20.04.
Исправление agentgoblin, :
любой твой цикл должен быть 0.2 секунды или меньше
Просто добавь printf
или return
c mem_X
в конце каждого примера. Иначе с -O2 и -O3 компилятор выкидывает все эти циклы и выделения памяти в топку как неиспользуемые, после чего скорость исполнения вырастает аж до 0,002s. В ассемблерном листинге можешь убедиться в этом (gcc -S).
Вариант с return mem_a[len-1][len-1];
:
$ gcc mallocs20k.c -O2 -DVillabajo -o Villabajo && time ./Villabajo
real 0m0,661s
user 0m0,144s
sys 0m0,515s
$ gcc mallocs20k.c -O3 -DVillabajo -o Villabajo && time ./Villabajo
real 0m0,559s
user 0m0,056s
sys 0m0,502s
В другой деревне с return mem_b[(len*len)-1];
:
$ gcc mallocs20k.c -O2 -DVillaribo -o Villaribo && time ./Villaribo
real 0m0,574s
user 0m0,132s
sys 0m0,441s
$ gcc mallocs20k.c -O3 -DVillaribo -o Villaribo && time ./Villaribo
real 0m0,627s
user 0m0,096s
sys 0m0,530s
Ryzen 5 2600 + DDR4 2666 + Ubuntu 20.04.
Исходная версия agentgoblin, :
любой твой цикл должен быть 0.2 секунды или меньше
Просто добавь printf
или return
c mem_X
в конце каждого примера. Иначе с -O2 и -O3 компилятор выкидывает все эти циклы и выделения памяти в топку как неиспользуемые, после чего скорость исполнения вырастает аж до 0,002s. В ассемблерном листинге можешь убедиться в этом (gcc -S).
Вариант с return mem_a[len-1][len-1];
:
$ gcc mallocs20k.c -O2 -DVillabajo -o Villabajo && time ./Villabajo
real 0m0,661s
user 0m0,144s
sys 0m0,515s
$ gcc mallocs20k.c -O3 -DVillabajo -o Villabajo && time ./Villabajo
real 0m0,559s
user 0m0,056s
sys 0m0,502s
В другой деревне с return mem_b[(len*len)-1];
:
$ gcc mallocs20k.c -O2 -DVillaribo -o Villaribo && time ./Villaribo
real 0m0,574s
user 0m0,132s
sys 0m0,441s
$ gcc mallocs20k.c -O3 -DVillaribo -o Villaribo && time ./Villaribo
real 0m0,627s
user 0m0,096s
sys 0m0,530s
Ryzen 5 2600 + DDR4 2666.