
Методы оптимизации.pptx
- Количество слайдов: 57
Александр Иванов al. s. ivanov@gmail. com МЕТОДЫ ОПТИМИЗАЦИИ
Правила игры Что такое оптимизация? Что оптимизировать? Время выполнения Память Человеческие ресурсы Зафиксируем наше понимание оптимизации
История проблемы В 1960 х годах – скорость В 1980 х годах – сопровождаемость кода Нужна ли сейчас оптимизация? Мобильные телефоны Встраиваемые решения Веб
Производительность Что такое производительность? Есть ли прямая связь? Копирование файлов на удаленный сервер
Производительность Эффективность Требования к программе Проект программы Проект классов и методов Взаимодействие с ОС Компиляция кода Оборудование Оптимизация кода
Требования к программе Требования часто завышены Нужно соизмерять затраты и реальные нужды
Проект программы Задание целевых показателей Выявление проблемных показателей в подсистемах на ранних этапах Задание явных целей Разбиение системы на модули не повышает быстродействие, но косвенно влияет на оптимизацию
Проекты классов Оптимизация уровня кода Выбор алгоритма
Взаимодействие с ОС Вы можете не знать, что работаете с ОС На разных ОС одни и те же методы могут выполняться разное время
Компиляция кода Часто огромного прироста производительности можно добиться на этом этапе Что если вам и нужно написать компилятор?
Оборудование Иногда дешевле купить новое оборудование
Оптимизация кода Изменение нескольких строк может повысить производительность на порядок
Принцип Парето 80/20 50/4 (уже Кнут)
Частые ошибки Меньше кода лучше? Какие-то операции быстрее других? Быстродействие важнее корректности?
Оптимизация компилятором Язык До После Прирост C++ 2, 21 1, 05 52% C++(2) 2, 78 1, 15 59% C++(3) 2, 43 1, 25 49% C# 1, 55 0% VB 1, 78 0% JVM 2, 77 0% JVM(2) 1, 39 1, 38 <1% JVM(3) 2, 63 0%
Узкие места Операции ввода/вывода Замещение страниц в оперативной памяти Системные вызовы Интерпретируемые языки Отладочный код
Оценка производительности Использование инструментов Опыт не помогает Оценка должна быть адекватной
Алгоритм Создание понятного кода, поддающегося изменению Если производительность не устраивает Сохранить работоспособную версию Оценить производительность Выявить узкое место программы Оптимизировать Если оптимизация не удалась возвращаемся к исходной версии Повторяем процесс с пункта 2.
Методики оптимизации кода Логика Циклы Изменение типов данных Выражения Методы Низкоуровневый язык
Логика Прекращение проверки сразу после получения ответа C/C++ поддерживает сокращенную проверку выражений по умолчанию Delphi требует включения специальной опции компилятора Всегда можно переписать код, чтобы он вычислялся как сокращенный
Логика negative. Input. Found = false; for (i = 0; i < count; ++i) { if (input[i] < 0) { negative. Input. Found = true; } }
Логика Упорядочивайте тесты по частоте If - else If – else – if Case Проверьте скорость выполнения операторов case и if –then –else на своей машине
Логика Замена сложных выражений на обращение к таблице Допустим вам нужно определить принадлежность к некому классу на основе некоторых факторов
Логика Отложенные вычисления Решение задач «по требованию» Кеширование
Циклы Размыкание цикла Объединение циклов Развертывание циклов i=0; while ( i < count ) { a[i] = i; ++i; } i = 0; while (i < count - 1) { a[i] = i; a[i + 1] = i + 1 i += 2; } // все ли ?
Циклы Минимизируйте объем работы, выполняемой внутри цикла for ( i = 0; i < rate. Count; ++i) { net. Rate[i] = base. Rate[i]*rates->discounts->factors>net; } ______________________ quantity. Discount = rates->discounts->factors->net; for ( i = 0; i < rate. Count; ++i) { net. Rate[i] = base. Rate[i]*quantity. Discount; }
Циклы Сигнальные значения Позволяют избавиться от одной из проверок в условии цикла Работает для циклов линейного поиска Можно применять к связным спискам
Циклы Вложение более ресурсоемкого цикла в менее ресурсоемкий Внешним циклом стоит делать цикл с меньшим числом итераций
Циклы Снижение стоимости операций Замена умножения на сложение
Изменение типов данных Использование целых чисел вместо чисел с плавающей точкой Использование массивов с минимальным числом измерений
Изменение типов данных Минимизация числа обращений с массивам Использование дополнительных индексов Кэширование
Выражения Алгебраические тождества Правила де Моргана для уменьшения числа логических операций Используйте свойство монотонности для дорогих функций
Выражения Снижение стоимости операций Замена умножения сложением Замена возведения в степень умножением Замена чисел с плавающей точкой на числа с фиксированной точкой или целые Замена умножения и деления на 2 операциями сдвига
Выражения Инициализация во время компиляции Переопределение системных методов Использование констант корректного типа Предварительное вычисление результатов Устранение часто используемых подвыражений
Методы Встраивание методов Функциями языка Препроцессирование Переписывание кода на низкоуровневом языке Для Python – Java, C++ Для С++ - asm
Средства оптимизации Профилятор Динамический анализ Статический анализ Метрики кода
Статический анализ Без реального выполнения программ Может проводиться на разных уровнях Исходный код MSIL
Средства статического анализа Gcc (современный компилятор) Cpp. Check Vera++ RATS Klocwork
Gcc В основном анализ внутри функций и стиля -Wall, -Wextra, -pedantic -Werror -Weffc++ -Woverloaded-virtual, -Wctor-dtorprivacy, -Wnon-virtual-dtor, -Wold-stylecast, -Wconversion -Wsign-conversion, Winit-self, -Wunreachable-code
Cpp. Check Самый используемый свободный анализатор memory leaks (частично) выход за границу массива exception в деструкторе разыменование нулевого указателя разыменование после очистки памяти виртуальность деструктора базового класса использование одного и того же итератора для разных контейнеров
Vera++ Проверка стиля Правила можно писать на tcl Можно использовать с системами версионного контроля
RATS Журнал Хакер рекомендует Ошибки безопасности В основном поиск небезопасных функций и переполнения буфера
Klocwork Платная система Поиск ошибок безопасности Работает с очень большими объемами кода Проектировалась как анализатор архитектур
Отступление Clang Хорошая альтернатива gcc для поиска ошибок и статического анализа PVS-studio - не статический анализатор Проверка онлайн Формальная верификация
Динамический анализ Valgrind IBM Rational Purify Insure++ Intel Thread Checker
Intel Thread Checker Коммерческий продукт Есть пробный период Поддерживает Windows и Linux Находит ошибки в параллельных программах Взаимные блокировки Использование общих переменных
IBM Rational Purify Не освобождается память Выход за границы массива Доступ к неинициализированной памяти Повторное освобождение, неправильное освобождение
Valgrind Лицензия GPL Linux и Mac. OS Утечки памяти Профилирование Работает по принципу вируальной машины Очень медленный
Valgrind Memcheck – основной иструмент (ошибки с памятью) Massif – профилировщик кучи Helgrind – ошибки многопоточных приложений Callgrind - профилятор Cachegrind – профилятор кэша
Valgrind профилирование Cachegrind Попадания в кэш L 1 и L 2 Есть возможность визуализации Умеет размечать исходные тексты метриками Callgrind Дерево вызовов функций в программе Есть возможность визуализации Умеет размечать исходные тексты метриками
Gprof Самый распространенный профилятор С, С++, Pascal, Fortran 77 Умеет строить аннотированную программу граф вызовов
Gprof Текст программы в коментариях к слайду gcc example 1. c -pg -o example 1 -O 2 –lc . /example 1 50000
Gprof Простой профиль gprof example 1 gmon. out –p
Gprof Граф вызовов gprof example 1 gmon. out –q
Gprof Аннотированый код Требует перекомпиляции с –g gprof example 1 gmon. out -A
Gprof Библиотечные вызовы по умолчанию не включаются в профилирование Для профилирования внешние библиотеки нужно пересобрать Профилирует только время пользовательского режима Плохо когда у вас много команд ввода/вывода Хорошо, что нет зависимости от нагрузки на ядро Используйте функцию time