Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 1438

.pdf
Скачиваний:
2
Добавлен:
30.04.2022
Размер:
1.16 Mб
Скачать

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

% улучшения изменений * % общего времени=% общего улучшения программы.

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

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

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

не стоит проводить оптимизацию подпрограммы.

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

1.Наивысшая эффективность для часто используемых программ, где эффективность – первоочередная задача программ (ОС, прикладные программы реального времени).

2.Эффективность существенна, но более важны удобство и надежность.

3.Эффективность не важна, гораздо более важно время разработки.

Для создания эффективной по времени программы ис-

пользуются следующие приемы [18].

1.Инициализация переменных вместе с их объявлением (этап компиляции). Позволяет избежать неопределенных значений переменных.

2.Минимизация времени вычисления промежуточных результатов, например,

y=a0*xn+a1*xn-1+ .. +an

133

следует заменить более экономичным выражением y=((..(a0*x+a1)*x+a1)*x+ .. +an .

3.Следует в выражениях группировать переменные одного типа, чтобы уменьшить количество преобразований типов, т.е. оптимизировать арифметические выражения с операндами различных типов за счет группировки однотипных объектов, например, integer

/\

A + I + B + J следует заменить на (A+B)+(I+J) ;

\ / real

4.Уменьшение силы арифметических операций, т.е. замена операций с более продолжительным временем менее трудоемкими Иногда долгие арифметические операции заменяются более быстрыми: +, -, *, /. При операциях с действительными числами накапливаются ошибки округления.

5.Удаление избыточных команд.

6.Сокращение времени на вызовы функций.

inline функции;

в точку вызова подставляется тело функции; макросы; запоминание в рабочей переменной текущего

времени, текущей даты.

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

for i:=1 to 10 do следует заменить на for a:=1 to 2 do

for j:=1 to 5 do

for j:=1 to 5 do

for a:=1 to 2 do

for i:=1 to 10 do

<оператор>;

<оператор>;

 

134

8.Короткие циклы следует исключать.

9.Использовать полную конструкцию: if -//- then -//- else -//-

10.Оптимизация логических выражений путем написания первой той части логического выражения, которая вероятней всего истинна.

11.На вычисление индексного выражения затрачивается время, поэтому часто встречающиеся выражения можно поместить во временную переменную.

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

13.Оптимизация памяти за счет применения записей с вариантами и частями, динамического распределения памяти, сокращения числа объектов в заголовках функций и процедур.

14.Для уменьшения длины программы следует приме-

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

ным кодированием.

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

16.Принято присваивать начальные значения элементам массива непосредственно перед его использованием, а не в начале программы.

17.Следует обращаться к данным для считывания запи-

си в порядке их расположения в памяти.

Более подробно о путях повышения эффективности программ можно прочитать в [17].

Контрольные вопросы

135

1.Что понимается под стилем программирования?

2.Для чего используются комментарии в программе?

3.Как составляются идентификаторы?

4.Что такое защитное программирование?

5.Для чего используется модульное программирование?

6.Что понимается под эффективностью программ?

7.Какие способы повышения эффективности существуют?

7. ОТЛАДКА И ТЕСТИРОВАНИЕ ПРОГРАММ

Различают синтаксические и семантические ошибки [2, 7, 14, 16]. Синтаксические выявляются в процессе компиляции программы. Семантические (смысловые) связаны с неверным пониманием постановки задачи, неверной алгоритмизацией и кодированием. Кроме того, различают ошибки времени подготовки программы (синтаксические) и времени выполнения программы (runtime error), которые обнаруживаются при прогонах готовой программы.

Источником ошибок в 90 % случаев является сам программист и постановщик задачи; 10 % относят к ошибкам системы программирования, ОС, аппаратуры.

Отладка складывается из контроля программы, локализации ошибок, исправления ошибок, предупреждения ошибок и тестирования [11].

Контроль программы заключается в обнаружении ошибок при написании текста. Контроль складывается из 3-х этапов: просмотра, проверки, прокрутки.

Локализация ошибок состоит в поиске точки, содержащей ошибку, и состоит в получение тестовых результатов, их

136

анализе, сверки с эталоном, выявлении факта ошибки, предположении о характере и месте расположения ошибки.

Точка обнаружения и точка возникновения ошибки обычно не совпадают. Локализации ошибки проводится по характеру точки обнаружения. Основным способом локализации является обратное отслеживание.

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

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

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

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

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

Втом случае, если простые методы не дают результата, используются более сложные методы. К ним относятся методы индукции и дедукции.

137

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

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

Существуют свои правила при проведении отладки про-

грамм.

1.Задачу необходимо понять и только потом отлаживать.

2.Перед поиском ошибки необходимо собрать все ее симптомы.

3.Обычно симптомы ошибки не совпадают с причинами, поэтому необходимо понять причину, прежде чем пытаться избавиться от симптомов.

4.Следует использовать средства отладки как вспомогательные, прежде всего, систематизируется информация о симптомах.

5.Ошибки имеют свойство флуктуации, т.е. группировки случайного количества случайных ошибок в случайном месте. Если в программе есть одна ошибка, то могут быть и другие.

6.Обычно место проявления ошибки и причины ее появления не совпадают. Вероятность правильного нахождения места возникновения ошибки не равна 1.

138

7.После исправления ошибки необходимо вернуться к этапу проектирования, внося изменения в проект. Соответствующие изменения отражаются в документации.

8.Рекомендуется собирать статистику собственных оши-

бок.

7.1. Компоновка и тестирование программных систем

Компоновкой программной системы называется объединение заранее подготовленных компонентов в единую сис-

тему [2, 3, 7, 11, 15, 17].

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

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

По результатам уточняется проектная и эксплуатационная документация, и составляются приемосдаточные акты.

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

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

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

139

исправление ошибок. Ошибки в программе появляются в результате:

неправильного понимания алгоритма;

неправильного кодирования;

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

Процесс отладки можно представить в виде диаграммы

(рис. 23).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ожидае-

 

Ошиб

 

 

 

 

 

 

мые ре-

 

Про-

 

 

 

 

 

 

 

 

Кор-

 

 

 

 

зультаты

 

ки

 

грамма

 

 

 

 

 

 

рекция

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Тестиро-

 

 

 

 

 

Оценива-

 

 

 

Отладка

 

 

вание

 

 

 

 

 

ние

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Исход-

Резуль-

 

 

 

 

 

 

ход-

таты

 

 

Интенсив-

 

 

 

ные

 

 

 

 

 

 

ность оши-

 

 

 

дан-

 

 

 

 

 

 

бок

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Прогноз на-

 

 

 

 

 

 

 

 

 

 

 

дежности

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Оценка надеж-

 

 

 

 

 

 

 

 

 

 

ности

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 23. Процесс отладки

В большинстве случаев источником ошибок является разработчик ПС.

140

Проверяются программы с помощью специальных тестов. Тест должен содержать:

набор исходных данных;

условия для запуска программы;

набор ожидаемых результатов.

Для полной проверки программы необходимо провести

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

7.2. Принципы тестирования

Различают функциональное (по методу «черного» ящика) и структурное (по методу «белого» ящика) тестирование ПС [1-3, 11, 15, 16].

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

При структурном тестировании исследуются внутренние блоки программ (логические условия, ветки, циклы и т.д.) и связи между ними.

7.3. Тестирование по методу «черного» ящика

Проверяется работа каждой функции программы на всей области определения данных. Каждая функция – это своеобразный «черный» ящик, для которого известны входные/выходные данные, но не известен алгоритм их преобразования. При тестировании необходимо подобрать входные дан-

141

ные, ведущие к аномальному поведению программы, и выходные данные, демонстрирующие дефекты программы.

Техника состоит в сокращении числа тестов и выявле-

нии классов ошибок, а не отдельных ошибок.

Для сокращения числа тестов можно поступить двумя способами.

1.Разбить данные на классы эквивалентности и

исследовать по одному набору данных из каждого класса.

2.Проводить исследования на граничных значени-

ях данных (анализировать граничные условия).

7.3.1. Разбиение на классы эквивалентности

По первому способу вся область данных (входных и выходных) разбивается на классы эквивалентности. Для каждого класса разрабатывается 1 тест.

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

Следует сразу же выделить допустимые и недопустимые данные, внутри которых проводится разделение на классы.

Правила формирования классов эквивалентности тако-

вы.

1.Если ввод предполагает диапазон значений, то выделяют 4 класса эквивалентности:

допустимый (например, n<=x<=m), недопустимый 1 (например, x<n), недопустимый 2 (например, x>m),

142