Скачать презентацию Александр Иванов al s ivanov gmail com МЕТОДЫ ОПТИМИЗАЦИИ Скачать презентацию Александр Иванов al s ivanov gmail com МЕТОДЫ ОПТИМИЗАЦИИ

Методы оптимизации.pptx

  • Количество слайдов: 57

Александр Иванов al. s. ivanov@gmail. com МЕТОДЫ ОПТИМИЗАЦИИ Александр Иванов al. s. ivanov@gmail. com МЕТОДЫ ОПТИМИЗАЦИИ

Правила игры Что такое оптимизация? Что оптимизировать? Время выполнения Память Человеческие ресурсы Зафиксируем наше Правила игры Что такое оптимизация? Что оптимизировать? Время выполнения Память Человеческие ресурсы Зафиксируем наше понимание оптимизации

История проблемы В 1960 х годах – скорость В 1980 х годах – сопровождаемость История проблемы В 1960 х годах – скорость В 1980 х годах – сопровождаемость кода Нужна ли сейчас оптимизация? Мобильные телефоны Встраиваемые решения Веб

Производительность Что такое производительность? Есть ли прямая связь? Копирование файлов на удаленный сервер Производительность Что такое производительность? Есть ли прямая связь? Копирование файлов на удаленный сервер

Производительность Эффективность Требования к программе Проект программы Проект классов и методов Взаимодействие с ОС Производительность Эффективность Требования к программе Проект программы Проект классов и методов Взаимодействие с ОС Компиляция кода Оборудование Оптимизация кода

Требования к программе Требования часто завышены Нужно соизмерять затраты и реальные нужды Требования к программе Требования часто завышены Нужно соизмерять затраты и реальные нужды

Проект программы Задание целевых показателей Выявление проблемных показателей в подсистемах на ранних этапах Задание Проект программы Задание целевых показателей Выявление проблемных показателей в подсистемах на ранних этапах Задание явных целей Разбиение системы на модули не повышает быстродействие, но косвенно влияет на оптимизацию

Проекты классов Оптимизация уровня кода Выбор алгоритма Проекты классов Оптимизация уровня кода Выбор алгоритма

Взаимодействие с ОС Вы можете не знать, что работаете с ОС На разных ОС Взаимодействие с ОС Вы можете не знать, что работаете с ОС На разных ОС одни и те же методы могут выполняться разное время

Компиляция кода Часто огромного прироста производительности можно добиться на этом этапе Что если вам Компиляция кода Часто огромного прироста производительности можно добиться на этом этапе Что если вам и нужно написать компилятор?

Оборудование Иногда дешевле купить новое оборудование Оборудование Иногда дешевле купить новое оборудование

Оптимизация кода Изменение нескольких строк может повысить производительность на порядок Оптимизация кода Изменение нескольких строк может повысить производительность на порядок

Принцип Парето 80/20 50/4 (уже Кнут) Принцип Парето 80/20 50/4 (уже Кнут)

Частые ошибки Меньше кода лучше? Какие-то операции быстрее других? Быстродействие важнее корректности? Частые ошибки Меньше кода лучше? Какие-то операции быстрее других? Быстродействие важнее корректности?

Оптимизация компилятором Язык До После Прирост C++ 2, 21 1, 05 52% C++(2) 2, Оптимизация компилятором Язык До После Прирост 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++ поддерживает сокращенную проверку выражений по умолчанию Логика Прекращение проверки сразу после получения ответа C/C++ поддерживает сокращенную проверку выражений по умолчанию Delphi требует включения специальной опции компилятора Всегда можно переписать код, чтобы он вычислялся как сокращенный

Логика negative. Input. Found = false; for (i = 0; i < count; ++i) Логика negative. Input. Found = false; for (i = 0; i < count; ++i) { if (input[i] < 0) { negative. Input. Found = true; } }

Логика Упорядочивайте тесты по частоте If - else If – else – if Case Логика Упорядочивайте тесты по частоте If - else If – else – if Case Проверьте скорость выполнения операторов case и if –then –else на своей машине

Логика Замена сложных выражений на обращение к таблице Допустим вам нужно определить принадлежность к Логика Замена сложных выражений на обращение к таблице Допустим вам нужно определить принадлежность к некому классу на основе некоторых факторов

Логика Отложенные вычисления Решение задач «по требованию» Кеширование Логика Отложенные вычисления Решение задач «по требованию» Кеширование

Циклы Размыкание цикла Объединение циклов Развертывание циклов i=0; while ( i < count ) Циклы Размыкание цикла Объединение циклов Развертывание циклов 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 < Циклы Минимизируйте объем работы, выполняемой внутри цикла 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 – Методы Встраивание методов Функциями языка Препроцессирование Переписывание кода на низкоуровневом языке Для Python – Java, C++ Для С++ - asm

Средства оптимизации Профилятор Динамический анализ Статический анализ Метрики кода Средства оптимизации Профилятор Динамический анализ Статический анализ Метрики кода

Статический анализ Без реального выполнения программ Может проводиться на разных уровнях Исходный код MSIL Статический анализ Без реального выполнения программ Может проводиться на разных уровнях Исходный код MSIL

Средства статического анализа Gcc (современный компилятор) Cpp. Check Vera++ RATS Klocwork Средства статического анализа Gcc (современный компилятор) Cpp. Check Vera++ RATS Klocwork

Gcc В основном анализ внутри функций и стиля -Wall, -Wextra, -pedantic -Werror -Weffc++ -Woverloaded-virtual, 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 Cpp. Check Самый используемый свободный анализатор memory leaks (частично) выход за границу массива exception в деструкторе разыменование нулевого указателя разыменование после очистки памяти виртуальность деструктора базового класса использование одного и того же итератора для разных контейнеров

Vera++ Проверка стиля Правила можно писать на tcl Можно использовать с системами версионного контроля Vera++ Проверка стиля Правила можно писать на tcl Можно использовать с системами версионного контроля

RATS Журнал Хакер рекомендует Ошибки безопасности В основном поиск небезопасных функций и переполнения буфера RATS Журнал Хакер рекомендует Ошибки безопасности В основном поиск небезопасных функций и переполнения буфера

Klocwork Платная система Поиск ошибок безопасности Работает с очень большими объемами кода Проектировалась как Klocwork Платная система Поиск ошибок безопасности Работает с очень большими объемами кода Проектировалась как анализатор архитектур

Отступление Clang Хорошая альтернатива gcc для поиска ошибок и статического анализа PVS-studio - не Отступление Clang Хорошая альтернатива gcc для поиска ошибок и статического анализа PVS-studio - не статический анализатор Проверка онлайн Формальная верификация

Динамический анализ Valgrind IBM Rational Purify Insure++ Intel Thread Checker Динамический анализ Valgrind IBM Rational Purify Insure++ Intel Thread Checker

Intel Thread Checker Коммерческий продукт Есть пробный период Поддерживает Windows и Linux Находит ошибки Intel Thread Checker Коммерческий продукт Есть пробный период Поддерживает Windows и Linux Находит ошибки в параллельных программах Взаимные блокировки Использование общих переменных

IBM Rational Purify Не освобождается память Выход за границы массива Доступ к неинициализированной памяти IBM Rational Purify Не освобождается память Выход за границы массива Доступ к неинициализированной памяти Повторное освобождение, неправильное освобождение

Valgrind Лицензия GPL Linux и Mac. OS Утечки памяти Профилирование Работает по принципу вируальной Valgrind Лицензия GPL Linux и Mac. OS Утечки памяти Профилирование Работает по принципу вируальной машины Очень медленный

Valgrind Memcheck – основной иструмент (ошибки с памятью) Massif – профилировщик кучи Helgrind – Valgrind Memcheck – основной иструмент (ошибки с памятью) Massif – профилировщик кучи Helgrind – ошибки многопоточных приложений Callgrind - профилятор Cachegrind – профилятор кэша

Valgrind профилирование Cachegrind Попадания в кэш L 1 и L 2 Есть возможность визуализации Valgrind профилирование Cachegrind Попадания в кэш L 1 и L 2 Есть возможность визуализации Умеет размечать исходные тексты метриками Callgrind Дерево вызовов функций в программе Есть возможность визуализации Умеет размечать исходные тексты метриками

Gprof Самый распространенный профилятор С, С++, Pascal, Fortran 77 Умеет строить аннотированную программу граф Gprof Самый распространенный профилятор С, С++, Pascal, Fortran 77 Умеет строить аннотированную программу граф вызовов

Gprof Текст программы в коментариях к слайду gcc example 1. c -pg -o example 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 –p

Gprof Граф вызовов gprof example 1 gmon. out –q Gprof Граф вызовов gprof example 1 gmon. out –q

Gprof Аннотированый код Требует перекомпиляции с –g gprof example 1 gmon. out -A Gprof Аннотированый код Требует перекомпиляции с –g gprof example 1 gmon. out -A

Gprof Библиотечные вызовы по умолчанию не включаются в профилирование Для профилирования внешние библиотеки нужно Gprof Библиотечные вызовы по умолчанию не включаются в профилирование Для профилирования внешние библиотеки нужно пересобрать Профилирует только время пользовательского режима Плохо когда у вас много команд ввода/вывода Хорошо, что нет зависимости от нагрузки на ядро Используйте функцию time