Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
voprosy_NEW.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

68. Построение эффективных программ.

ЭФФЕКТИВНОСТЬ ПРОГРАММ

Основной задачей программирования является создание пра­вильных, а не эффективных программ. Эффективная программа не нужна, если она не обеспечивает правильных результатов.

ОТНОШЕНИЕ К ЭФФЕКТИВНОСТИ

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

К первому типу относятся часто используемые программы. Это операционные системы, компиляторы, прикладные подпрограммы и системы резервирования авиабилетов. Для этих программ эф­фективность является первостепенной задачей вследствие их ча­стого использования и специфического выполнения.

Второй тип составляют производственные программы, исполь­зуемые длительное время. Этот тип программ пишут профессио­нальные программисты. Хотя эффективность таких программ су­щественна, обычно еще больше внимания уделяют их эксплуатаци­онным характеристикам.

Третий тип программ—программы, написанные не программи­стами, а научными работниками или администраторами. Здесь эффективность имеет значение только для программ, которые должны уместиться в заданном объеме памяти и выполняться за приемлемое время.

ЭФФЕКТИВНОСТЬ ИЛИ УДОБОЧИТАЕМОСТЬ?

Многие методы, делающие программу эффективной, не наносят ущерба ее удобочитаемости. Эти методы следует использовать всегда. Некоторые меры по повышению эффективности могут быть просто вредными для по­лучения удобочитаемой программы. Удобочитаемость программы обычно более важна, чем эффективность.

ОПТИМИЗИРУЮЩИЕ КОМПИЛЯТОРЫ

Эффективность важна на двух стадиях разработки програм­мы: компилирования и выполнения. Если компилятор работает быстро, то он обычно составляет программу, которая выполняется медленно. Компиляторы, создающие эффективную объектную про­грамму, обычно бывают большими и работают медленно, так как оптимизируют объектную программу.

Некоторые современные компиляторы позволяют пользователю выбрать ресурс, который нужно оптимизировать.

ОПТИМИЗАЦИЯ ПРОГРАММ

Основными критериями при этом должны являться время и объем памяти, ис­пользуемые программой. Если оптимизация старого алгоритма не дает желаемого ре­зультата, тогда, возможно, следует выбрать другой алгоритм.

ВРЕМЯ РАБОТЫ ПОДПРОГРАММ

После деления программы на подпрограммы следует опреде­лить процент времени, используемый каждой подпрограммой. Это необходимо сделать для того, чтобы узнать, какие части програм­мы расходуют больше всего времени.

ПАМЯТЬ

Недостаток объема памяти в машине является общей пробле­мой.

Память делят на участки различного разме­ра. Если программа достаточно компактна, чтобы разместиться в одном из таких участков памяти, то чем меньше этот участок, тем быстрее выполняется программа и ниже стоимость.

ВИРТУАЛЬНАЯ ПАМЯТЬ

Если машина имеет виртуальную память, то операционная система автоматически делит программу на части фиксированной длины, называемые страницами. Кроме того, опе­рационная система в случае необходимости пересылает страницы в оперативную память. ВЫЧИСЛЕНИЕ КОНСТАНТ

Программы становятся более удобочитаемыми, если в них ис­пользуются выражения, включающие константы. Cons int a =10;

Если выражения с кон­стантами не вычисляются во время компилирования, необходимо их всегда располагать вне цикла.

Процесс выполнения операторов, значения которых известны на стадии компилирования, что позволяет не выполнять их во время прогона программы, обычно называют сверткой. Свертка выполня­ется также для значений, которые могут быть определены внутри блоков программы.

ИНИЦИИРОВАНИЕ ПЕРЕМЕННЫХ

Если начальные значения присваиваются переменным одновре­менно с их объявлением, то тем самым экономится время выпол­нения программы. В этом случае переменные получают начальные значения во время компилирования, а не во время выполнения.

АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ

Математические операции в порядке возрастания време­ни их выполнения: 1) сложение или вычитание, 2) умножение, деление, 4) возведение в степень.

Для оптимизации программы необходимо заменять 1 операцию другой. (* на +)

ОПТИМИЗАЦИЯ в ПРОЦЕССЕ КОМПИЛИРОВАНИЯ

Некоторые компиляторы выполняют оптимизацию, которая со­стоит в исключении повторяющихся вычислений, однако сущест­вуют сильные ограничения на количество типов оптимизирующих операций. Чем больше их число, тем больше компилятор и, следо­вательно, тем медленнее выполняется компилирование.

Другим ограничением на оптимизацию в процессе компилиро­вания является то, что компилятор может оптимизировать только линейные участки программы, т. е. те, которые имеют один вход (первая выполняемая команда) и один выход (последняя выпол­няемая команда).

ОПТИМИЗАЦИЯ ЦИКЛОВ

Опе­раторы внутри цикла могут выполняться много тысяч раз и любая экономия, даже совсем небольшая, будучи увеличена в тысячи раз, дает существенный выигрыш.

Разберем при­мер:

Цикл А 100 итераций

Цикл В 100 итераций

Цикл С 100 итераций

I—Конец С Конец В

Конец А

Оптимизируйте сначала внутренние циклы.

Дальнейшее улучшение (которое может привести к ухудшению удобочитаемости программы) состоит в том, чтобы расположить на первом месте условие, которое, по всей вероятности, является истинным, а за ним остальную часть условия.

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

ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ

Как только в первом выражении встретится значение TRUE, все выражение считается истинным, тогда как второе выражение счи­тается ложным, как только в нем встретится значение FALSE. Для того чтобы получить пользу от оптимизации вычислений, про­граммист должен расположить переменные в выражении в таком порядке, чтобы самая левая переменная чаще других вызывала завершение всего логического выражения.

ИНДЕКСАЦИЯ

Индексы полезны, хотя они расходуют и машинное время, и память. Если к индексированной переменной обращаются внутри одно­го или нескольких операторов более одного раза, присвойте ее зна­чение другой переменной. Не следует применять индексацию внутри цикла там, где можно обойтись использованием простой переменной.

Индексация обладает еще одной особенностью: чем больше ин­дексов используется, тем менее эффективна программа. Это озна­чает, что массив А(720) более эффективен, чем массив А(12, 5, 12).

Еще один метод сокращения числа индексов заключается в том, чтобы сделать двумерные или многомерные массивы эквивалент­ными одномерному массиву. Недостаток заключается в снижении удобочитаемости: читающий должен заметить, что два массива эквивалентны. Ухуд­шение удобочитаемости может быть серьезным недостатком, если оно приводит к путанице или затрудняет модификацию программы.

Внутри циклов следует избегать вычислений со сложной индек­сацией.

ОТЛАДКА ПРОГРАММ

Отладка программы предполагает обязательное наличие той или иной ошибки; в противном случае мы имеем дело с тестированием. В общем времени разработки программы отладка занимает, по оценкам специалистов, от 50 до 90%.

Процесс отладки зависит от используемой машины, языка программирования, операционной системы, специфики самой задачи и от особенностей конкретной программы.

Каждый язык, компилятор и машина связаны с определенными типами дефектов программ и ошибок программирования. Простейшим примером являются синтаксические ошибки, которые в очень сильной мере предопределяются конкретным языком программирования.

РАЗЛИЧИЕ МЕЖДУ ОТЛАДКОЙ И ТЕСТИРОВАНИЕМ

Отладка имеет место тогда, когда программа со всей очевидностью работает неправильно. Поэтому отладка начинается всегда в предвидении отказа программы. Если же оказывается, что программа работает верно, то она тестируется. Таким образом, тестирование устанавливает факт наличия ошибки, а отладка выявляет ее причину, и эти два этапа разработки программы перекрываются.

ОШИБКИ В ОПИСАНИИ ЗАДАЧИ (Подобная ситуация может складываться как из-за отсутствия взаимопонимания между программистами и пользователями, так и от того, что пользователи в действительности не знают, чего они хотят)

ОШИБКИ В ВЫБОРЕ АЛГОРИТМА (В качестве примера неэффективного, плохо подобранного алгоритма можно назвать способ решения задачи, который дает точный ответ, но требует больших затрат времени)

ОШИБКИ АНАЛИЗА (Эти ошибки связаны либо с неполным учетом могущих возникнуть ситуаций, либо с неверным решением задачи)

ОШИБКИ ОБЩЕГО ХАРАКТЕРА (Такими ошибками могут быть: ошибки из-за недостаточного знания или непонимания программистом языка программирования или самой машины, программы не удовлетворяют некоторым требованиям, но эти требования не были сформулированы в задании на разработку программ)

ОШИБКИ ФИЗИЧЕСКОГО ХАРАКТЕРА

1. Пропуск некоторых программных карт или строк.

2. Перестановка карт или строк программы.

3. Появление лишних карт или строк (например, в результате того, что оказались не вычеркнутыми скорректированные строки).

4. Отсутствие необходимых данных.

5. Непредусмотренные данные

6. Неверный формат данных.

7. Отсутствие операторов управления заданиями.

8. Использование неверной распечатки программы.

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