Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ekzamenatsionnye_voprosy_po_IiP.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
289.28 Кб
Скачать

Выбор длины промежутков

Среднее время работы алгоритма зависит от длин промежутков —  , на которых будут находиться сортируемые элементы исходного массива ёмкостью   на каждом шаге алгоритма. Существует несколько подходов к выбору этих значений:

  • первоначально используемая Шеллом последовательность длин промежутков:   в худшем случае, сложность алгоритма составит  ;

2. Методы оптимизации структуры и выполнения программного кода

1. Минимизируйте количество локальных переменных. Тогда компилятор сможет их хранить в регистрах, а не на стеке. 2. Объявляйте переменные там, где они будут использоваться, давая им наименьшую область видимости. Это способствует выполнению пункта 1.

  1. Не передавайте в функцию большое количество параметров. Большое количество параметров будет хранится на стеке, а не в регистрах. Если нужно передать большую структуру воспользуйтесь указателем (ссылкой), но не передавайте по значению. 4. Используйте список инициализации конструктора, вместо присвоения значений в его теле. Так поля будут инициализироваться один раз. Это наиболее ощутимо, если эта переменная — класс. Тогда в первом случае вызовется только конструктор, а во втором конструктор и функция.

  2. . Используйте int вместо char, short для локальных переменных и для переменных структур, если нет цели минимизировать потребление памяти. int будет работать быстрее. При использовании переменных char и short, они будут конвертироваться в int во всех арифметических операциях. 7. Делайте настолько простой конструктор, насколько возможно. Не забывайте, что он будет вызываться при любом создании объекта. Если объект часто создается в промежуточных вычислениях, то лучше, чтобы конструктор был мал. Например делая структуру Vector3 не нужно в конструкторе по умолчанию инициализировать поля x,y,z нулями. Сделайте для этого лучше отдельный конструктор, а конструктор по умолчанию оставьте пустым. Это приблизит вашу структуру к POD типу и сделает более эффективными операции, где не явно создаются новые объекты. 8. Не создавайте возвращаемого результата в функции, у которой возвращаемое значение никогда не будет использоваться. Компилятор не знает, будет ли оно использоваться и всегда будет возвращать значение. Например не делайте тип bool возвращаемым значением функции, если не собираетесь его обрабатывать. 9. Не делайте функции виртуальными без необходимости. Вызов виртуальной функции значительно дороже вызова обычной функции, поэтому не нужно делать ее виртуальной предполагая, что кому-нибудь понадобится изменить ее поведение в будущем. Если такая необходимость возникнет, то можно будет легко сделать функцию виртуальной в будущем. 10. Если функция класса не зависит от его переменных (использует только входные параметры), делайте ее статической. Это позволит компилятору эффективнее оптимизировать код. 11. Используйте конструкцию if() вместо if-else везде, где это возможно. Помните, что ветвление — очень дорогая операция (точнее дорогая операция jump, т.к. она ломает конвейер команд процессора). В случае if-else, прыжок происходит в любом случае, а в случае команды if только в одном. 12. Примеры рефакторинга кода. Второй вариант эффективнее первого. Эти преобразования стоит иметь в виду и использовать только при серьезной оптимизации кода. Помните, что преждевременная оптимизация — зло.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]