tehnologia (Г.С. Иванова - Учебник - Технология программирования), страница 13
Описание файла
Файл "tehnologia" внутри архива находится в папке "Учебник - Технология программирования". PDF-файл из архива "Г.С. Иванова - Учебник - Технология программирования", который расположен в категории "". Всё это находится в предмете "информационные технологии" из 2 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информационные технологии" в общих файлах.
Просмотр PDF-файла онлайн
Текст 13 страницы из PDF
Эффективность и технологичностьТрадиционно эффективными считают программы, требующие минимального временивыполнения и/или минимального объема оперативной памяти. Особые требования кэффективности программного обеспечения предъявляют при наличии ограничений (на времяреакции системы, на объем оперативной памяти и т.п.). В случаях, когда обеспечениеэффективности не требует серьезных временных и трудовых затрат, а также не приводитк существенному ухудшению технологических свойств, необходимо это требование иметь ввиду.Разумный подход к обеспечению эффективности разрабатываемого программногообеспечения состоит в том, чтобы в первую очередь оптимизировать те фрагментыпрограммы, которые существенно влияют на характеристики эффективности.
Дляуменьшения времени выполнения некоторой программы в первую очередь следуетпроанализировать циклические фрагменты с большим количеством повторений: экономиявремени выполнения одной итерации цикла будет умножена на количество итераций.Не следует забывать и о том, что многие способы снижения временных затрат приводятк увеличению емкостных и, наоборот, уменьшение объема памяти может потребоватьдополнительного времени на обработку.И тем более не следует «платить» за увеличение эффективности снижениемтехнологичности разрабатываемого программного обеспечения. Исключения возможнылишь при очень жестких требованиях и наличии соответствующего контроля за качеством.Частично проблему эффективности программ решают за программиста компиляторы.Средства оптимизации, используемые компиляторами, делят на две группы:• машинно-зависимые, т.
е. ориентированные на конкретный машинный язык,выполняют оптимизацию кодов на уровне машинных команд, например, исключениелишних пересылок, использование более эффективных команд и т.п.;• машинно-независимые выполняют оптимизацию на уровне входного языка, например,вынесение вычислений константных (независящих от индекса цикла) выражений из циклов ит.п.Естественно, нельзя вмешаться в работу компилятора, но существует многовозможностей оптимизации программы на уровне команд.Способы экономии памяти. Принятие мер по экономии памяти предполагает, что вкаких-то случаях эта память неэкономно использовалась.
Учитывая, что анализировать имеетсмысл только операции размещения данных, существенно влияющие на характеристикуэффективности, следует обращать особое внимание на выделение памяти под данныеструктурных типов (массивов, записей, объектов и т.п.).68Прежде всего при наличии ограничений на использование памяти следует выбиратьалгоритмы обработки, не требующие дублирования исходных данных структурных типов впроцессе обработки. Примером могут служить алгоритмы сортировки массивов,выполняющие операцию в заданном массиве, например, хорошо известная сортировкаметодом «пузырька».Если в программе необходимы большие массивы, используемые ограниченное время, тоих можно размещать в динамической памяти и удалять при завершении обработки.Также следует помнить, что при передаче структурных данных в подпрограмму «позначению» копии этих данных размещаются в стеке.
Избежать копирования иногда удается,если передавать данные «по ссылке», но как неизменяемые (описанные const). В последнемслучае в стеке размещается только адрес данных, например:Type Massiv=array[l.. 100] of real;function Summa (f Const; a Massiv; ...)...Способы уменьшения времени выполнения. Как уже упоминалось выше, дляуменьшения времени выполнения в первую очередь необходимо анализировать циклическиеучастки программы с большим количеством повторений. При их написании необходимо повозможности:• выносить вычисление константных, т.е. не зависящих от параметров цикла, выраженийиз циклов;• избегать «длинных» операций умножения и деления, заменяя их сложением,вычитанием и сдвигами:• минимизировать преобразования типов в выражениях;• оптимизировать запись условных выражений – исключать лишние проверки;• исключать многократные обращения к элементам массивов по индексам (особенномногомерных, так как при вычислении адреса элемента используются операции умноженияна значение индексов) – первый раз прочитав из памяти элемент массива, следует запомнитьего в скалярной переменной и использовать в нужных местах;• избегать использования различных типов в выражении и т.п.Рассмотрим следующие примеры.Пример 2.2.
Пусть имеется цикл следующей структуры (Pascal):for у: =0 to 99 dofor x:=0 to 99 doa[320*x+y]:=S[k,l];В этом цикле операции умножения и обращения к элементу S[k] выполняются 10000 раз.Оптимизируем цикл, используя, что 320 = 28 + 26:69skl:=S[k,l];{выносим обращение к элементу массива из цикла}for x:=0 to 99 do{меняем циклы местами}begini: =х skl 8+x skl 6;{умножение заменяем на сдвиги и выносим из цикла}for y:=0 to 99 do a[i+y]: =skl;end; ...В результате вместо 10000 операций умножения будут выполняться 200 операцийсдвига, а их время приблизительно сравнимо со временем выполнения операции сложения.Обращение к элементу массива S[k] будет выполнено один раз.Пример 2.3. Пусть имеется цикл, в теле которого реализовано сложное условие:for k: =2 to n dobeginif x[k]>yk then S:=S+y[k]-x[k];if (x[k]<=yk) and (y[k]<yk) then S:=S+yk-x[k];end;...В этом цикле можно убрать лишние проверки:for к: =2 to n do beginif x[k]>yk then S:=S+y[k]-x[k] elseif y[k]<yk then S:=S+yk-x[k];end;...Обратите внимание на то, что в примере 2.2 понять, что делает программа, сталосложнее, а в примере 2.3 – практически нет.
Следовательно, оптимизация, выполненная впервом случае, может ухудшить технологичность программы, а потому не очень желательна.2.7. Программирование «с защитой от ошибок»Любая из ошибок программирования, которая не обнаруживается на этапах компиляциии компоновки программы, в конечном счете может проявиться тремя способами: привести квыдаче системного сообщения об ошибке, «зависанию» компьютера и получению неверныхрезультатов.70Однако до того, как результат работы программы становится фатальным, ошибкиобычно много раз проявляются в виде неверных промежуточных результатов, неверныхуправляющих переменных, неверных типах данных, индексах структур данных и т.п. (рис.2.10).
А это значит, что часть ошибок можно попытаться обнаружить и нейтрализовать, покаони еще не привели к тяжелым последствиям.Программирование, при котором применяют специальные приемы раннего обнаруженияи нейтрализации ошибок, было названо защитным или программированием с защитой отошибок. При его использовании существенно уменьшается вероятность получения неверныхрезультатов.Детальный анализ ошибок и их возможных ранних проявлений показывает, чтоцелесообразно проверять:• правильность выполнения операций ввода-вывода;• допустимость промежуточных результатов (значений управляющих переменных,значений индексов, типов данных, значений числовых аргументов и т.д.).Проверки правильности выполнения операций ввода-вывода.
Причинами неверногоопределения исходных данных могут являться, как внутренние ошибки – ошибки устройствввода-вывода или программного обеспечения, так и внешние ошибки – ошибкипользователя. При этом принято различать:• ошибки передачи – аппаратные средства, например, вследствие неисправности,искажают данные;71• ошибки преобразования – программа неверно преобразует исходные данные извходного формата во внутренний;• ошибки перезаписи – пользователь ошибается при вводе данных, например, вводитлишний или другой символ;• ошибки данных – пользователь вводит неверные данные.Ошибки передачи обычно контролируются аппаратно.Для защиты от ошибок преобразования данные после ввода обычно сразудемонстрируют пользователю («эхо»). При этом выполняют сначала преобразование вовнутренний формат, а затем обратно.
Однако предотвратить все ошибки преобразования наданном этапе обычно крайне сложно, поэтому соответствующие фрагменты программытщательно тестируют [31], используя методы эквивалентного разбиения и граничныхзначений (см. § 9.4).Обнаружить и устранить ошибки перезаписи можно только, если пользователь вводитизбыточные данные, например контрольные суммы.
Если ввод избыточных данных покаким-либо причинам нежелателен, то следует по возможности проверять вводимые данные,хотя бы контролировать интервалы возможных значений, которые обычно определены втехническом задании, и выводить введенные данные для проверки пользователю.Неверные данные обычно может обнаружить только пользователь.Проверка допустимости промежуточных результатов. Проверки промежуточныхрезультатов позволяют снизить вероятность позднего проявления не только ошибокневерного определения данных, но и некоторых ошибок кодирования и проектирования. Длятого чтобы такая проверка была возможной, необходимо, чтобы в программеиспользовались переменные, для которых существуют ограничения любого происхождения,например, связанные с сущностью моделируемых процессов.Однако следует также иметь в виду, что любые дополнительные операции в программетребуют использования дополнительных ресурсов (времени, памяти и т.п.) и могут такжесодержать ошибки.
Поэтому имеет смысл проверять не все промежуточные результаты, атолько те, проверка которых целесообразна, т.е. возможно позволит обнаружить ошибку, ине сложна. Например:• если каким-либо образом вычисляется индекс элемента массива, то следуетпроверить, что этот индекс является допустимым;• если строится цикл, количество повторений которого определяется значениемпеременной, то целесообразно убедиться, что значение этой переменной неотрицательно;• если определяется вероятность какого-либо события, то целесообразно проверить,что полученное значение не более 1, а сумма вероятностей всех возможных независимыхсобытий равна 1 и т.д.Предотвращение накопления погрешностей. Чтобы снизить погрешности результатоввычислений, необходимо соблюдать следующие рекомендации:72• избегать вычитания близких чисел (машинный ноль);• избегать деления больших чисел на малые;• сложение длинной последовательности чисел начинать с меньших по абсолютнойвеличине;• стремиться по возможности уменьшать количество операций;• использовать методы с известными оценками погрешностей;• не использовать условие равенства вещественных чисел:• вычисления производить с двойной точностью, а результат выдавать – с одинарной.Обработка исключений.
Поскольку полный контроль данных на входе и в процессевычислений, как правило, невозможен, следует предусматривать перехват обработкиаварийных ситуаций.Для перехвата и обработки аппаратно и программно фиксируемых ошибок в некоторыхязыках программирования, например, Delhi Pascal, C++ и Java, предусмотрены средстваобработки исключений.