|
Эффективность программы во время выполнения определяется использованием двух ресурсов. Первый из них — необходимое для работы время, а второй — память, которая требуется программе. Время — более важный фактор для программиста, так как в большинстве случаев программа оценивается количеством машинного времени, необходимого для ее выполнения. Поскольку сейчас многие вычислительные центры взимают плату за объем используемой программой памяти, вполне вероятно, что вопросы, связанные с памятью, приобретут еще более важное значение. Обычно же проблема памяти существенна только тогда, когда ее недостаточно.
Оптимизировать память труднее, чем время выполнения. Нет ничего удивительного в том, что после оптимизации программа будет выполняться на 25% быстрее, но было бы необычно получить уменьшение размера используемой ею памяти на 25%; при этом предполагается, что не было допущено серьезных ошибок в первоначальном варианте программы.
Помните, однако, что если бы вы выбрали новый лучший алгоритм и перепрограммировали задачу, то могли бы существенно улучшить как время выполнения, так и объем потребляемой памяти. Очень трудно значительно сократить используемую программой память, потому что сэкономленные области памяти разбросаны в небольших количествах по всей программе. В отличие от этого скорость выполнения можно значительно увеличить, например оптимизируя такую часть программы, как цикл, который многократно повторяется.
Но иногда даже небольшая экономия памяти бывает просто необходима (чтобы можно было использовать конкретную программу для данной машины), тогда как небольшая экономия времени не так уже важна.
Мы увеличиваем эффективность выполнения программы, улучшая ее, насколько возможно, на стадии компилирования. Компили^ рование включает такие действия, как инициирование массивов и1 переменных, вычисление констант и распределение памяти. Распределение памяти на стадии компилирования обычно увеличивает расход памяти за счет сэкономленного времени выполнения программы.
Хорошие приемы программирования приводят к уменьшению как времени выполнения, так и объема используемой памяти, однако зачастую улучшение одного из этих факторов происходит за счет ухудшения другого. Большинство из обсуждающихся здесь методов экономит как время, так и память. Если использование метода приводит к возникновению конфликта между временем и "памятью, это будет оговорено.
В большинстве случаев небольшое увеличение эффективности 'не имеет смысла, если оно связано с тратой значительного количества времени на программирование и вызывает ухудшение удобочитаемости, надежности, универсальности или удобства. Однако ^иногда это стоит делать. Типичным примером является компилятор, при создании которого затрачиваются большие усилия для йолучения эффективной программы. Но, поскольку компилятор используется неоднократно, даже малое увеличение эффективности приносит большие дивиденды. Эффективность также очень важна * в библиотеках программ. Поскольку эти программы используются часто, небольшое увеличение эффективности будет, как правило, сокращать время работы машины.
В каждом конкретном случае повышение эффективности зависит от ряда факторов, таких, как стоимость улучшения программы, частота ее использования, относительная скорость выполнения различных операций в машине, и от способа компилирования различных операторов.
Хорошей считается программа, которая выполняется при минимальном расходе машинного времени. В этом случае за данный отрезок времени можно выполнить еще и другие задания. С появлением мультипроцессорной обработки (т. е. выполнением более одного задания за то же время) стало желательным также и минимальное использование памяти, так как при работе в указанном режиме каждая программа должна находиться в оперативной памяти. Чем меньший объем памяти требуется каждой программе, тем больше программ можно разместить в оперативной памяти и обработать за одно и то же время. В режиме мультипроцессорной обработки использование оперативной памяти так же важно, как и расход времени. Сокращение занимаемой памяти или расхода времени будет уменьшать стоимость выполнения программы. Так как ресурсы машины очень дороги, то экономия даже небольшого количества времени или памяти в многократно используемой программе может вполне стоить затраченных усилий.
Обычно любая попытка улучшить эффективность предназначается для часто используемых программ. Хотя это весьма результативный подход, однако есть другой путь сэкономить большое количество машинного времени. Вырабатывайте комплекс привычек, которые будут способствовать составлению более эффективной программы и соответственно экономии машинного времени.
⇐3.4. Оптимизация программ || Оглавление || 3.6. Память⇒
|