Некоторые приёмы повышения эффективности программ Вычисление констант
Программы становятся более удобочитаемыми, если в них используются выражения, включающие константы. Для выполнения вычислений, содержащих только константы, применяют множество различных методов компилирования. Некоторые компиляторы вычисляют все выражения с константами во время компилирования и запоминают результат. Другие компиляторы запоминают константы, а вычисления осуществляются во время выполнения. Второй способ неэффективен, если выражения находятся внутри циклов. Если выражения с константами не вычисляются во время компилирования, необходимо их всегда располагать вне цикла.
Процесс выполнения операторов, значения которых известны на стадии компилирования, что позволяет не выполнять их во время прогона программы, обычно называют сверткой. Свертка выполняется также для значений, которые могут быть определены внутри блоков программы.
Инициирование переменных
Если начальные значения присваиваются переменным одновременно с их объявлением, то тем самым экономится время выполнения программы. В этом случае переменные получают начальные значения во время компилирования, а не во время выполнения. Инициирование переменных во время их объявления облегчает документирование программ, а также помогает избежать ошибок, которые могут возникнуть в случае, если переменным не были присвоены начальные значения.
Инициируйте переменные во время компилирования.
3.Арифметические операции
Арифметические операции выполняются с различной скоростью. Полезно знать, какие операции выполняются быстрее, так как иногда бывает целесообразно заменить одну операцию другой. Перечислим математические операции в порядке возрастания времени их выполнения: 1) сложение или вычитание, 2) умножение, 3) деление, 4) возведение в степень.
Некоторые медленно выполняемые операции легко заменить на более быстрые.
Сложение выполняется быстрее, чем умножение, поэтому умножение на небольшое целое число следует заменять сложением. Так, 3*1 должно быть заменено на 1+1+1. Если в выражении не все числа являются целыми, то при замене может быть утеряна точность. Ошибка округления действительных чисел имеет тенденцию накапливаться, а не уменьшаться. Так, если К — действительное число, а I — целое, то 1*К более правильно, чем К+К+К+К— (I раз).
Преобразование уравнений может привести к исключению операций. Например, выражение Х = 2*Y+(А—1)/Р+2*Т можно заменить уравнением
Х = 2*(Y+Т) + (А—1)/Р, что исключает одну операцию умножения.
Поскольку деление является более медленной операцией, всюду, где возможно, его следует заменять умножением. Умножение выполняется по меньшей мере в два раза быстрее деления. Исключайте деление из вашей программы всюду, где это возможно: вместо А/5.0 пишите А*0.2.
Если в вычислениях вы все время делите на некоторое число, папример на X, замените его на обратную величину.
Важно также правильно задать тип показателя степени в операции возведения в степень. Всегда, когда это возможно, следует использовать целые числа. Например,
Медленный способ: А**8.0 или А**Р, где Р — число с плавающей точкой.
Более быстрый способ: А**8 или А**1, где I — целое число.
Второй способ обеспечивает более быстрое выполнение; кроме того, он и более точен, так как при этом исключаются некоторые типы ошибок. Таким образом, если выполняется возведение в степень целых чисел, делайте показатель степени целым числом.
Если показатель степени — целое число, то операцию возведения в степень выполняют повторяющимся умножением. Если показатель степени является числом с плавающей точкой, то для выполнения операции возведения в степень необходимо вызвать специальную подпрограмму.
Функция извлечения квадратного корня реализуется обычно гораздо быстрее, и точность при этом выше, чем при выполнении операции возведения в степень.
Умножение выполняется значительно быстрее возведения в степень, поэтому, если показатель степени — небольшое целое число, то операцию возведения в степень следует заменять несколькими операциями умножения:
Для возведения в степень обычно требуется библиотечная программа. Поэтому замена его несколькими операциями умножения экономит и память, и время, если показатель степени является небольшим целым числом.
Заменяйте Х**2 на Х*Х Заменяйте Х**3 на Х*Х*Х Заменяйте Х**4 на (Х*Х)#(Х*Х)
или на (((Х*Х)*Х)*Х)
Последний пример содержит повторяющееся вычисление (Х*Х), которое в дальнейшем может быть оптимизировано. Замена одной операции другой, выполняемой более быстро, называется уменьшением силы операции. Уменьшение силы операции может иногда ухудшить удобочитаемость программ, и об этом следует всегда помнить. Кроме того, при таком преобразовании некоторое количество машинного времени затрачивается на управление промежуточными результатами.
Арифметика с фиксированной точкой
Большинство машинных языков допускает целочисленную арифметику. Она может применяться для любых типов вычислительных операций. Для целых чисел используются специальные процедуры, потому что многие вычислительные задачи имеют дело только с целыми числами (обработкой информации, связанной с инвентаризацией, переписью), а целочисленная арифметика обычно выполняется одной машинной командой, в то время как арифметика с плавающей точкой часто выполняется подпрограммами, включающими множество команд машинного языка.
Некоторые машины могут выполнять 50 операций сложения целых чисел за время, требуемое для выполнения одной операции сложения с плавающей точкой. В этом случае целочисленную арифметику следует использовать всюду, где это возможно, особенно для выполнения большого числа простых арифметических операций над целыми числами, такими, как индексы. Использование неправильного типа переменных для индексов может значительно увеличить время выполнения любой программы.
Впрочем, некоторые машины выполняют операции с плавающей точкой быстрее, чем операции с фиксированной точкой. Обычно это большие машины, служащие для проведения научных расчетов. Они имеют специальное оборудование, обеспечивающее выполнение арифметических операций с плавающей точкой.
Особое внимание следует уделить тому, чтобы внутренние переключатели, счетчики и переменные, встречающиеся в многочисленных вычислениях, были такого типа, который приводит к самым эффективным вычислениям. Это чаще всего является проблемой при работе с переменными, являющимися строками символов. Если возникает такая ситуация, то для каждого вычисления необходимо делать многочисленные преобразования. И память, и время можно сэкономить правильным описанием переменных.
Смешанные типы данных
Смешанные типы данных получаются в результате использования чисел различного типа в арифметических и логических операциях. Если вы смешиваете числа разного типа, то при выполнении арифметических операций часто бывают необходимы преобразования. Ситуацию можно улучшить, объявляя как можно больше переменных одинакового типа. В этом случае нужно меньше заботиться о том, чтобы избежать смешанных вычислений, поскольку почти все переменные одного типа. Хотя смешанная арифметика допускается, чтобы уменьшить количество ошибок и помочь программисту, ее следует избегать, так как она занимает больше времени и памяти.
Избегайте смешанных типов данных,
Способ устранения ошибок
В некоторых простых компиляторах следует тщательно выбирать тип используемых констант. Например, А = 0 (неэффективно) А = 0.0 ( эффективно).
Некоторые компиляторы требуют преобразования целого нуля в вещественный во время выполнения программы, как в случае А = 0; во втором случае необходимость в преобразовании отсутствует. Хороший компилятор запоминает константу в нужной форме при компилировании, а не во время выполнения.
Если преобразование необходимо, оно может занять очень много времени при его выполнении внутри цикла.
|