Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 3491 / 369 | Оценка: 4.65 / 4.29 | Длительность: 30:37:00
Специальности: Программист, Менеджер
Лекция 11:

Отладка и оптимизация программ. Отладка

Оптимизация программ

Результаты работы с системой документов должны удовлетворять заданным спецификациям. Эти результаты должны быть получены в заданное время. Точный прогноз погоды на завтра требуется сегодня, получить его послезавтра становится бессмысленным. Поэтому программисту постоянно приходится заботиться не только о корректности работы своих программ, но и об их эффективности. И здесь успех, во многом, определяется решениями, принимаемыми на самом верхнем уровне разработки проекта. Самое важное решение связано с выбором подходящей среды программирования. Здесь нужно точно учитывать перспективы развития разрабатываемой системы и выбираемой среды программирования, насколько средства, выбранные Вами сегодня, смогут удовлетворять Вашим завтрашним потребностям. Другой разрез, для многих задач не менее важный, состоит в правильном выборе структур данных и алгоритмов их обработки. Нет ничего лучше хорошего алгоритма. Он, как правило, определяет эффективность решения задач. Важную роль в повышении эффективности играет и переиспользование. Ранее созданные, тщательно проверенные и эффективные компоненты, могут определить и эффективность вновь решаемой задачи. Рассмотрение всех этих вопросов, главных источников эффективности работы системы в целом, выходит за рамки данной книги. Мы остановимся сейчас на деталях, каждая из которых в отдельности не способна существенно повысить эффективность решения. При добыче золота, можно пытаться найти самородок, а можно промывать руду, добывая песчинку за песчинкой. Так и при разработке программ, песчинки, повышающие эффективность, могут принести в результате ощутимый эффект.

Прежде, чем начать рассмотрение отдельных элементов, еще пару слов о измерениях, которые выполняет программист, для повышения эффективности своей программы. Известен эффект "bottle neck", - узких мест программы, которые могут быть причиной ее не эффективного поведения. Чтобы получить представление о том, есть ли в программе такие узкие места, требующие первостепенного вмешательства и переписывания, чаще всего требуется построение полного профиля программы. Причем и здесь важна представительная система тестов. Опять таки, мы не будем сейчас рассматривать средства построения профиля. Отметим только, что в ряде случаев можно для проведения измерений использовать функцию Timer.По ходу изложения мы несколько раз демонстрировали ее применение.

Приемы оптимизации кода

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

Объявление переменных

Для уменьшения размеров требуемой памяти и ускорения выполнения операций над данными:

  • При работе с большими массивами данных, размер которых, как правило, может изменяться, используйте динамические массивы или динамические структуры данных.
  • Объявляйте переменные в строгом соответствии с их возможным типом. Не используйте без крайней необходимости тип Variant. Работа с Variant требует больше памяти и дополнительных преобразований.
  • При задании типа, как правило, используйте тип с более узкой областью определения, достаточной для представления возможных значений. Здесь могут быть исключения, специфические для VBA. Так переменные типа Integer преобразуются к типу Long, так что разумнее задавать сразу тип Long вместо типа Integer.
  • Операции с плавающей точкой выполняются более долго, поскольку требуют обращения к сопроцессору. Поэтому тип Single и Double следует использовать только в случае действительной необходимости. Иногда, можно воспользоваться типом Currency для выполнения подобных действий. В этом случае потребуется больше памяти, но не будет обращений к сопроцессору с плавающей точкой.
  • При работе с объектами следует вводить переменные соответствующего объектного типа. Они хранят ссылки на объекты, а работа со ссылками выполняется значительно быстрее, чем с самими объектами.
  • При объявлении объектных переменных избегайте объявления Object, указывайте явный тип объекта. Типы Object и Variant весьма полезные типы, но применять их нужно только в случае действительной необходимости.

В одном из примеров, я приводил таблицу временных измерений выполнения арифметических операций над данными разных типов. Рекомендую провести подобные замеры в более полном объеме.

Математические операции
  • При работе с целыми используйте целочисленные операции, - деление нацело, взятие остатка и другие, не выводящие за пределы целых чисел.
  • В выражениях, где одновременно присутствуют целые числа и числа с плавающей точкой перед проведением операций всегда происходит преобразование к типам с плавающей точкой Single и Double. Для уменьшения подобных преобразований, записывайте выражения так, чтобы пересечение переменных целого и плавающего типа было, по возможности, минимальным.
Строковые операции
  • При работе со строками используйте введенные в Office 2000 функции Replace, функции разбора строки и другие. Ранее мы подробно рассказали об их достоинствах.
  • Избегайте, по возможности, использования конкатенации. Используйте Replace в большинстве случаев. В тех случаях, когда заменяется одна подстрока на другую такой же размерности, можно использовать функцию Mid, как в следующем примере:
    Public Sub TestCode()
    	Dim Text As String
    	Text = "Компилятор кода"
    	Mid(Text, 1, 5) = "Транс"
    	Debug.Print Text
    End Sub
  • Строковые константы VBA могут сократить время вычислений, позволяя избежать вызовов функций. Так, например, эффективнее использовать константу vbCrLf, чем комбинацию символов Chr(13), Chr(10), задающих возврат каретки и перевод строки.
  • Иногда медленные операции над строками можно изменить на операции работы с их кодами. Код
    If Asc(Text) = 202

    работает быстрее, чем код

    If Left(Text,1) = "K"

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

Циклы

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

  • Все вычисления, которые могут быть сделаны вне цикла, должны быть вынесены из него.
  • Предусматривайте возможность досрочного завершения цикла, когда решение задачи уже получено.
  • Аккуратно работайте в цикле с элементами массивов. Старайтесь избегать лишнего вычисления индексных выражений и обращений к элементам массива. Часто введение дополнительных переменных позволяет существенно ускорить работу с элементами массивов.
  • При работе с коллекциями объектов Office 2000 используйте цикл For Each вместо обычного цикла For. В большинстве случаев это приводит к существенному выигрышу во времени исполнения цикла.

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

полина есенкова
полина есенкова
Дмитрий Вологжин
Дмитрий Вологжин
Добрый день, прошел тесты с 1 по 9, 10 не сдал, стал читать лекцию и всё пройденные тесты с 1 по 9 сбросились, когда захотел пересдать 10 тест.