Один из способов повысить
эффективность кодирования М-файлов - это
профилировать их, то есть определить время,
затрачиваемое на вычисление каждой строки. Профилирование
- это процедура измерения затрат времени на
выполнение строк программы. Результат таких
измерений часто оказывается неожиданным,
поскольку затраты оказываются максимальными
вовсе не там, где предполагалось. Поэтому
первоначальную реализацию прграммы надо делать
настолько простой, насколько это возможно, а
затем использовать профилировщик, чтобы выявить
критические участки программы, если
быстродействие действительно является главным
показателем эффективности создаваемой
программы. Преждевременная оптимизация может
усложнить код, не обеспечив реального повышения
эффективности.
Профилировщик целесообразно использовать,
чтобы выявить М-функции, которые требуют
большого времени, затем определить, почему и как
они вызываются и поискать способы минимизации их
использования. Часто бывает полезно задаться
вопросом, а требуется ли вызывать М-функцию
столько раз. Поскольку программы часто имеют
несколько уровней, может оказаться, что
созданный код вызывает наиболее трудоемкие
функции неявно. Более точно, функции внутри
вашего кода могут вызывать другие функции,
которые требуют большого времени и могут
находиться на более низких уровнях. В этом случае
важно определить, какие из функций высшего
уровня являются ответственным за такие
обращения.
Часто профилировщик помогает выявить проблемы,
которые могут быть решены:
- отказом от лишних вычислений, которые могут
быть следствием невнимательности;
- корректировкой алгоритма, чтобы избежать
вызова неэффективных М-функций;
- отказом от многократных повторных вычислений
путем хранения результатов для последующего
использования.
Конечная цель профилирования состоит в том,
чтобы повысить быстродействие программы. Как
только достигается сосотояние, когда наибольшее
время тратится на обращения к малому числу
встроенных функций, то это означает, что
достигнута оптимизация кода.
Функционирование профилировщика
Команда profile позволяет обратиться к тем
М-функциям, которые предполагается
профилировать. При каждом обращении можно
профилировать только одну М-функцию. В процессе
профилирования ведется отсчет интервалов в 0.01
секунду, необходимых для вычисления каждой
строки.
Оператор profile. Эта команда позволяет
запустить профилировщик из командной строки,
используя следующую форму обращения
profile <ключевое слово>,
где в качестве ключевого слова могут быть
использованы:
- имя М-функции;
- опции on, off, done, reset для управления процессом
профилирования;
- опция report для вывода на экран результатов
профилирования текущего М-файла;
- опция plot для вывода результатов в графической
форме в виде функции Парето.
Рассмотрим применение функции profile на
следующем примере.
Пример:
profile ellipke
[k, e] = ellipke(.01:.01:.99);
profile report
Спецификация файла. Команда profile
позволяет указать имя М-файла для
профилирования. Она автоматически запускает
профилировщик, вызывая специфированную функцию.
Задать встроенную или М-функцию можно с помощью
следующей команды profile
profile <имя_функции>,
где имя_функции может содержать указание
пути доступа. В случае М-файла профилировщик
подсчитывает количетво строк и нумерует их; в
процессе исполнения М-файла идет подсчет времени
выполнения строки с тактом 0.01 с.
Опции on и off. Эти опции позволяют
запускать и приостанвливать профилировщик.
Заметим, что спецификация файла в команде profile
автоматически запускает профилировщик; в
процессе профилирования команды profile on и profile off
позволяют управлять этим процессом. Если
делается попытка запустить профилировщик
командой profile on, не указав имени файла, то
возвращается ошибка.
Просмотр результатов профилирования.
Опция report выводит на экран результаты
профилирования. Отчет включает полную
длительность исполнения функции, а также листинг
пронумерованных строк с указанием затраченного
времени и его процентной доли от полного времени.
Пример.
Сеанс работы профилировщика.
Рассмотрим следующую последовательность
операций при работе с профилировщиком:
- Специфицировать профилируемый файл hilb.m,
который генерирует матрицу Гильберта:
profile hilb
Чтобы просмотреть текст М-файла воспользуйтесь
командой type hilb function
H = hilb(n)
- Выполнить М-файл hilb.m:
H = hilb(40);
- Завершение профилирования:
profile done
Полученные результаты будут зависеть от
используемого компьютера.
Визуализация результатов профилирования.
Функция pareto позволяет достаточно просто
реализовать графический образ результатов
профилирования
profile
erfcore z = erf(0:.01:100);
profile report
Теперь сформируем выход профилировщика,
используя команду profile без входных аргументов:
t = profile
Выход t это структура, которая содержит
результаты профилирования функции erfcore.m в поле
count. Чтобы увидеть эти результаты, надо
воспользоваться функцией pareto в форме:
pareto(t.count)
|