Рекомендации по созданию и отладке программ.

В настоящем пункте рассмотрены некоторые способы повышения эффективности создания программ в системе MATLAB, в том числе рекомендации в части повышения быстродействия программ и ее «читабельности».

1. Следует широко использовать комментарии при написании текста программы. Как уже отмечалось, язык программирования MATLAB является интерпретируемым языком высокого уровня, достаточно наглядным и интуитивно понятным, в нем отсутствуют малоинформативные низкоуровневые функции (подобные машинным кодам). Однако даже для того, чтобы разобраться в хорошо знакомой программе спустя некоторое время, полезно не пренебрегать комментариями. В идеале, можно и вовсе закомментировать каждый шаг выполнения программы.

Многие пользователи ограничиваются лишь добавлением комментария с описанием M-файла в начало программы (например, содержащего описание используемых алгоритмов или особенностей задания аргументов функции). Такие комментарии будут отображаться в командной строке после ввода команды

help имя_M-файла

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

2. Следует использовать поэлементные операции с массивами вместо циклов. При запуске программы на исполнение MATLAB интерпретирует команды, записанные в M-файлах в машинный код и по очереди их выполняет. Заметим, что если программа содержит циклы, то время, затрачиваемое системой на интерпретацию, увеличивается, причем каждая строка цикла интерпретируется столько раз, сколько раз будет прокручиваться цикл. В этой связи при создании программ следует, по возможности, избегать использования циклов. Такой подход тем более правомочен, если вспомнить, что MATLAB – это матричная система и аргументами соответствующих функций могут являться не только скалярные величины, но и массивы. В связи с этим MATLAB, в отличие от многих других языков программирования может заменять циклы for и while поэлементными операциями над массивами, что позволяет существенным образом снизить временные затраты на выполнение соответствующих программ.

3. Следует выделять память под массивы. На практике не всегда можно векторизовать алгоритм, заданный в цикле, однако можно использовать способы повышения скорости работы цикла. Для этого необходимо предварительно выделить память под массивы, заполнение которых осуществляется в цикле.

Так, например, программа решения простейшего примера создания вектор-строки x, длина которой с каждым следующим шагом цикла for увеличивается на один элемент и в результате достигнет 10000 элементов

x=0;

for k=2:10000

x(k)=x(k-1)+7;

end

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

x=zeros(1,10000);

for k=2:10000

x(k)=x(k-1)+7;

end

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

4. Следует использовать файл-функции. Программа всегда будет выполняться быстрее, если она реализована в виде файл-функции, а не как файл-программа. Созданную файл-программу несложно переделать в файл-функцию (не имеющую, как правило, входных и выходных параметров), добавив в соответствующем месте объявление function.

5. Следует использовать специальные настройки среды MATLAB. При первой загрузке содержимого M-файла в память компьютера система MATLAB осуществляет синтаксический разбор программного кода, переводит его во внутренний формат, называемый псевдокодом или p-кодом, после чего сохраняет псевдокод в памяти компьютера в течение всего сеанса работы с системой MATLAB. В результате первый вызов файл-функций выполняется медленнее (хотя обычно и ненамного медленнее) повторных вызовов. Можно несколько повысить эффективность первого выполнения M-функций, выполнив команду

pcode имя_файл-функции

которая транслирует содержимое M-файла в псевдокод и записывает на диск файл с тем же именем, но с расширением .p, после чего загрузка файл-функции будет выполняться именно из этого файла и первое исполнение файл-функции пройдет быстрее. Можно будет даже стереть файл с расширением .m, а содержимое оставшегося файла с псевдокодом будет невозможно прочитать в текстовых редакторах в силу бинарного формата этого файла – так можно скрыть детали реализованных в файл-функции алгоритмов.

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

Часть 7.

Наши рекомендации