Научная литература
booksshare.net -> Добавить материал -> Математика -> Боглаев Ю.П. -> "Вычислительная математика и программирование " -> 40

Вычислительная математика и программирование - Боглаев Ю.П.

Боглаев Ю.П. Вычислительная математика и программирование — Высшая школа, 1990. — 546 c.
ISBN 5-06-00623-9
Скачать (прямая ссылка): vychmatiprog1990.djvu
Предыдущая << 1 .. 34 35 36 37 38 39 < 40 > 41 42 43 44 45 46 .. 168 >> Следующая

116
\
' V
В нашем подходе к улучшению программ мы будем исходить из того, что из определенного опыта в предметной области уже выбрана математическая модель, а из анализа методов вычислений выбран вычислительный алгоритм. Выбранный алгоритм либо уже запрограммирован, либо может быть запрограммирован на фортране. Так как программа на фортране не может быть выполнена на ЭВМ, фортран-программа преобразуется (транслируется) на машинный язык. Программа на машинном языке называется объектной программой или объектным кодом.
Основными критериями эффективности программы будем считать время выполнения и объем оперативной памяти для реализации объектного кода. При этом часто время выполнения можно сократить увеличивая объем необходимой памяти. Поскольку для решения средних по сложности задач объем оперативной памяти не представляет ограничений, мы в целях улучшения программ в основном будем стремиться к их максимальному быстродействию.
Наконец, необходимо отметить, что существующие трансляторы с фортрана имеют оптимизирующие блоки. Однако не следует думать, что неэффективную программу такой транслятор преобразует в эффективную. Он лишь улучшит некоторые доступные ему фрагменты программы. Поэтому для написания эффективных программ пользователь должен самостоятельно по ходу программирования осуществлять оптимизирующие преобразования. Более подробно с оптимизацией программ можно познакомиться в [17].
3.4.2. Исключение повторных вычислений. Это преобразование предусматривает исключение из программы избыточных команд. С этой целью, просматривая текст фортран-программы, исключают выражения, которые производят выполненные ранее вычисления.
Например, в последовательности операторов
X = А * (1. + С08(В))
У = А —С/В
г=с/в+1.+со8(В)
слагаемые
С/В + (1. + С08(В))
в последнем операторе производят уже выполненные ранее вычисления. Поэтому вместо приведенного фрагмента следует использовать более эффективную последовательность операторов
и = 1. + С08(В)
У = С/В Х = А*и У = А —У
г=у+и
Хотя новый фрагмент длиннее старого, но он эффективнее по времени выполнения и объему используемой памяти.
117
Следующий, более сложный, пример указывает на то, что рассматриваемое преобразование необходимо выполнять осторожно, так как присутствие в программе похожих выражений не означает, что они вычисляют одинаковые значения. Например, в последовательности
х=у*г-и у=у . у=у+2.-у*г у/=у*г+г*\
нельзя заменить У*Х одной переменной, поскольку в третьем операторе происходит изменение значения У. С другой стороны, в первом и четвертом операторах непохожее выражение Z*Y на У*Ъ вычисляв!^ (из-за второго оператора) то же самое значение. Здесь повторные вычисления исключаются следующим образом:
т=у*г
Х = Т-и'
У = У
У = У + 2. —Т
\у=у*г+т
3.4.3. Замена медленно выполняемых операций на более быстрые.
Время выполнения арифметических операций различно, оно возрастает в следующем порядке: сложение или вычитание, умножение, деление,
возведение в степень.
Поэтому для небольших целых чисел N выражения вида
А*]Ч; А**И
целесообразно заменять на
А+А+...+А; А*А*...*А
одновременно исключая повторные вычисления. Операцию деления целесообразно заменять умножением на обратную величину. Поясним эти рекомендации на примере:
где слева — фрагмент программы до преобразования, справа — после него. Затем из правого фрагмента, исключая повторные вычисления, получим более эффективную программу
С = А*2 + В;
И=Х**2 + (Х**3+4.)/У; Е = (А + В)*(1.+Х**4);
С=А+А+В
И = Х*Х+(Х*Х*Х+4.)/У Е = (А + В)*(1.+Х*Х*Х*Х)
Т = А + В С = А + Т Б=Х*Х Я = 8*Х
118
\
V
0 = 8 + (К + 4)/У Е = Т*(1 +Я*Х)
Замена операции деления иллюстрируется следующим примером:
Х = А/У; Т=1./У
г = (А + В)/У + 8Ш(1./У); Х = А*Т
V = г/У; Ъ = (А + В) * Т + БШСГ)
или V =
А = В/2; А = В*0.5
3.4.4. Применение констант в арифметических выражениях. Если значения некоторых переменных в процессе вычислений не изменяются и они известны, то замена переменных константами в арифметических выражениях позволит увеличить быстродействие. Однако, как уже упоминалось выше, изменение значения такой константы может потребовать значительных усилий при исправлении текста программы.
Пример.
А=1;
В = 2*
С = (А + В)*2 + г;
0 = А*А-г;
Если необходимо будет заменить значение А = 1 другой константой, то в старом варианте следует исправить один оператор, а в новом— три.
3.4.5. Сокращение преобразований данных. При вычислении арифметических выражений, в которых участвуют переменные и константы разных типов (целые, вещественные, с двойной точностью, комплексные), происходит преобразование данных к одному типу, а затем выполнение операций. Поэтому, если позаботиться о том, чтобы в вычислениях как можно меньше смешивались типы данных, можно ускорить выполнение программы. Например, замена оператора
А=1
следующим
А= 1.0
исключает преобразование данных, если А имеет вещественный тип.
3.4.6. Сокращение индексированных переменных. Любое обращение к индексированной переменной (элементам массива) связано с выполнением команд, вычисляющих значение индекса и адрес переменной. Время на выполнение операции можно сократить, если удастся заменить в некоторых операторах индексированные переменные на переменные без индекса. Например, замена левого цикла на правый
Предыдущая << 1 .. 34 35 36 37 38 39 < 40 > 41 42 43 44 45 46 .. 168 >> Следующая

Реклама

c1c0fc952cf0704ad12d6af2ad3bf47e03017fed

Есть, чем поделиться? Отправьте
материал
нам
Авторские права © 2009 BooksShare.
Все права защищены.
Rambler's Top100

c1c0fc952cf0704ad12d6af2ad3bf47e03017fed