576.71K
Category: programmingprogramming

Инструментальные средства. Анализ и оптимизация

1.

Организация процесса проектирования
Программного обеспечения
Тема 4.3.1: Инструментальные средства.
Анализ и оптимизация
ст. преп. каф. ВТ
Васильев В.С.

2.

Содержание раздела
1.инструментальные средства проектирования;
2.компиляторы (оптимизирующие)/интерпретаторы:
• язык программирование (фичи, связь с оптимизацией);
• флаги компиляции/параметры интерпретатора;
• инструменты типа GodBolt/VisualVM;
3.профилировщики;
4.анализаторы кода:
• статические;
• динамические;
5.системы сборки и менеджеры пакетов;
6.системы контроля версий;
7.инструменты тестирования кода:
• отладчики?;
• средства модульного тестирования;
• интеграционного тестирования?
• нагрузочного тестирования?
• средства типа GooglePostman;
8.средства управления проектом.
2

3.

1.1 Методы оптимизации кода.
Удаление неиспользуемого кода
Опрос:
1) что тут является неиспользуемым кодом?
2) предложить еще варианты программ с неиспользуемым кодом.
3

4.

1.1 Методы оптимизации кода.
Удаление неиспользуемого кода
https://godbolt.org/z/6Pjvjb
4

5.

1.1 Методы оптимизации кода.
Удаление неиспользуемого кода
5

6.

1.2 Методы оптимизации кода.
Оптимизация параметров функций
1.Неиспользуемые аргументы функций;
2.Передача в стеке и регистрах;
3.Оптимизация возвращаемого значения.
4.(см. на предыдущих примерах)
6

7.

1.3 Методы оптимизации кода.
Замена рекурсии циклом. Оптимизация хвостового вызова.
После оптимизации:
https://godbolt.org/z/x8sxEq
7

8.

1.4 Методы оптимизации кода.
Inline-подстановка. Упрощение выражений
Опрос:
1) Что стоит подставлять, а что — нет?
2) Что плохого в упрощении выражений?
8

9.

1.5 Методы оптимизации кода.
Распараллеливание
1.Разрезание, склеивание, перестановка, … циклов. Учет
особенностей архитектуры и среды исполнения.
2.Все ли циклы есть смысл распараллеливать? Опрос: что будем
распараллеливать в алгоритме умножения матриц методом
«строка на столбец»?
3.Распараллелить можно по-разному (средства синхронизации и
т.д.)
4.Пересекается со многими другими методами оптимизации.
5.Существует множество проектов, направленных на (частично)
автоматическое распараллеливание.
6.Причем тут функциональное программирование?
9

10.

1.6 Методы оптимизации кода.
Сжатие структур
https://godbolt.org/z/eM1hWa
Опрос:
1) Почему?
2) Может ли такую оптимизацию
выполнять компилятор?
10

11.

1.6 Методы оптимизации кода.
Сжатие структур
Что выведется? Сколько занимают объекты? Влияют ли флаги
https://godbolt.org/z/s93W4x
А как в других языках?
1) Сколько в Java занимает boolean и з
2) Размер объектов в этом случае отли
3) Все очень похоже на С++:
https://habr.com/ru/post/136883/
Текущие результаты:
1) оптимизировать можно многое, но вручную плохо. Почему?
2) оптимизатор может не все. Почему?
3) когда и как надо оптимизировать код?
11

12.

1.7 Методы оптимизации кода.
Замена аллокатора
Стандартный malloc vs jemalloc
12

13.

1.7 Методы оптимизации кода.
Замена аллокатора
Вместо стека память может быть аллоцирована на стеке (С++14).
В Java/C#/Python тоже.
13

14.

1.6 Методы оптимизации кода.
Что еще?
1) Есть тысячи других методов оптимизации. Однако, оптимизатор никогда не выполняе
2) Оптимизация тесно связана с верификацией. Как?
2.1) оптимизации с плавающей точкой — это очень сложно.
2.2) Проблема алиасинга указателей.
2.3) Проблемы с исключениями;
3) Оптимизация может выполняться:
3.1) автоматически;
3.2) с помощью программиста (открытая распараллеливающая система, макросы likely/
3.3) на основе профилирования (программистом или Profile-Guided-Optimization);
4) При использовании PGO может произойти ухудшение для некоторых процессоров (п
5) LTO очень эффективна (clang++ -flto), но очень медленна.
14

15.

2 Методы оптимизации кода.
Представления программы в оптимизаторе
1. Какие зависимости есть в программах?
- зависимости по управлению;
- зависимости по данным;
- циклические зависимости (решетчатые графы и т.п.);
2. Что есть еще?
- типизация;
- контракты, noexcept и прочее.
3. SSA-форма и def-use graph;
15

16.

2 Методы оптимизации кода.
Представления программы в оптимизаторе
4. Часть оптимизаций компилятор выполняет сам, а часть — делегирует на слой LLVM.
Оптимизатор LLVM (middle-end) умеет далеко не все оптимизации. Например, constexr
16

17.

Дополнительная литература по методам оптимизации
1. Распараллеливание алгоритма триангуляции матрицы с
OpenMP (анализ вариантов). URL: https://proprof.com/forums/topic/matrix-triangulation_cplusplus
2. OpenMP — распараллеливание методов численного
интегрирования (сравнение ручного распараллеливания и
стандартных средств OpenMP). URL: https://proprof.com/forums/topic/openmp-left-rectangle-method
3. Пример анализа и распараллеливания алгоритма (для
распараллеливания может быть нужно переписать алгоритм).
URL: https://pro-prof.com/forums/topic/complex_example_openmp
4. Миллер, Р. Последовательные и параллельные алгоритмы:
Общий подход / Р. Миллер, Л. Боксер ; пер. с англ. — М. :
БИНОМ. Лаборатория знаний, 2006. — 406 с.
5. Оптимизирующая распараллеливающая система. URL:
https://pro-prof.com/forums/topic/ops
6. Открытая распараллеливающая система (есть инструкции по
работе). URL: http://ops.rsu.ru/about.shtml
17

18.

Дополнительная литература по методам оптимизации
7. Язык Cilk/Cilk++. URL: https://ru.wikipedia.org/wiki/Cilk
8. Язык параллельного программирования X10 (обзор). URL:
https://pro-prof.com/forums/topic/x10
9. Язык параллельного программирования Chapel (обзор). URL:
https://pro-prof.com/forums/topic/язык-параллельногопрограммирования
10. Удаленные вычислительные узлы в Erlang. URL: https://proprof.com/forums/topic/удаленные-вычислительные-узлы-в-erlang
11. Размер Java объектов. Используем полученные знания. URL:
https://habr.com/ru/post/136883/
12. Профилирование кода на C/C++ в Linux и FreeBSD:
https://eax.me/c-cpp-profiling/
13. Инструменты профайлинга С++ кода (краткое содержание
доклада). URL: https://vk.com/wall-105242702_688
14. PGO: уход и кормление (краткое содержание доклада). URL:
https://vk.com/wall-105242702_801
18

19.

Дополнительная литература по методам оптимизации
15. Что не умеет оптимизировать компилятор (краткое содержание
доклада). URL: https://vk.com/wall-105242702_837
16. How do the likely/unlikely macros in the Linux kernel work and
what is their benefit? (Ручное управление оптимизацией с
макросами). URL: https://stackoverflow.com/questions/109710/howdo-the-likely-unlikely-macros-in-the-linux-kernel-work-and-what-istheir-ben
17. Аллокаторы памяти (для С++). URL:
https://habr.com/ru/post/505632/
18. Анализ программ и компиляторов в Compiler Explorer. URL:
https://pro-prof.com/archives/7565
19

20.

3 Методы оптимизации кода.
Оптимизация программы под кэши.
(в отдельном файле), но сначала — чуть-чуть про статический анализ программ: https:/
20
English     Русский Rules