
- •Лабораторная работа №3
- •Задание
- •Краткая теория
- •Устранение несущественных проверок указателей на NULL.
- •Выполнение
- •Часть 1
- •Часть 2
- •Часть 3
- •Вывод
- •Контрольные вопросы:
- •4. Всегда ли оптимизирующая компиляция позволяет уменьшить время работы программы?
- •5. Чем отличается общая оптимизация от оптимизации под архитектуру?
- •6. Какие имеются группы ключей в GCC?
- •7. Какие уровни оптимизации есть в GCC, и чем они характеризуются?
- •Контрольные вопросы

Часть 3
Создадим новую директорию, дадим ей название optimization.
Скомпилируем программу компилятором GCC с уровнями оптимизации - O0, -
O1, -O2, -O3, -Os, -Ofast, -Og под архитектуру процессора x86. Дадим файлу с
кодом имя main.c (рисунок 14). Для каждого из семи вариантов компиляции
измерим время работы программы при нескольких значениях N (N = 7500000000,
N = 6500000000 и N = 5500000000, при таких значениях время выполнения
программ достигает 179 секунд). Реализуем алгоритм вычисления числа π с
помощью разложения в ряд (ряд ГрегориЛейбница) по формуле Лейбница N
первых членов ряда:
Листинг реализации алгоритма (рисунок 15):
#include <stdio.h> #include <stdlib.h> #include <sys/times.h> #include <unistd.h>
int getSign(long long pow) { return pow % 2 == 0 ? 1 : - 1;
}
long double findPi(long long N) { long double result = 0.0;
while (N >= 0) {
result += (long double) (getSign(N) / (2.0 * N + 1.0)); N--;
}
return result * 4.0;
}
int main(int argc, char *argv[]) {
21

struct tms start, end;
long clocks_per_sec = sysconf(_SC_CLK_TCK); long clocks;
long long N = argc > 1 ? atoll(argv[1]) : 7500000000L; times(&start);
long double PI = findPi(N); times(&end);
clocks = end.tms_utime - start.tms_utime;
printf("Result: %Lf, N = %lld, time = %lf sec\n", PI, N, (double) clocks / clocks_per_sec);
return 0;
}
Список команд для компиляции: gcc -o lab2-O0.bin -O0 main.c
gcc -o lab2-O1.bin -O1 main.c gcc -o lab2-O2.bin -O2 main.c gcc -o lab2-O3.bin -O3 main.c gcc -o lab2-Os.bin -Os main.c
gcc -o lab2-Ofast.bin -Ofast main.c gcc -o lab2-Og.bin -Og main.c
Рисунок 14 – Создание директории и файла с кодом
22

Рисунок 15 – Содержание файла main.c
Скомпилируем разными уровнями оптимизации программу (рисунок 16).
Рисунок 16 – Компиляция с разными уровнями оптимизации
23

Рисунок 17 – Работа программы при N=7500000000
Рисунок 18 – Работа программы при N=6500000000
Рисунок 19 – Работа программы при N=5500000000
После чего составим диаграмму в Exсel по результатам работы программы с разными значениями и разными видами компиляции (Рисунок 20):
24