LINUX.ORG.RU

История изменений

Исправление 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.