Профилирование m-файлов
Вообще говоря, достижение работоспособности программы – лишь один из этапов ее отладки. Не менее важным вопросом является оптимизация программы по минимуму времени исполнения или по минимуму объема кодов. Современные компьютеры, в которых используется система MATLAB, имеют достаточные резервы памяти, так что размеры программы, как правило, не имеют особого значения. Намного важнее проблема оптимизации программы в части быстродействия.
Оценка времени исполнения отдельных частей программы называется ее профилированием. Для выполнения такой процедуры служит команда profile [Средства профилирования MATLAB позволяют анализировать только m-файлы функций, но не сценариев. Чтобы получить профиль выполнения сценария, приходится преобразовывать его в функции (как правило, не имеющую входных и выходных параметров), добавляя соответствующий заголовок function.], имеющая ряд опций:
- profile fun – запуск профилирования для функции fun;
- profile report – вывод отчета о профилировании;
- profile plot – графическое представление результатов профилирования в виде диаграммы Парето;
- profile filename – профилирование файла с заданным именем и путем;
- profile report N – вывод отчета по профилированию заданных N строк;
- profile report frac – выводит отчет по профилированию тех строк, относительная доля выполнения которых в общем времени выполнения составляет не менее чем frac (от 0.0 до 1.0);
- profile on – включение профилирования;
- profile off – выключение профилирования;
- profile reset – выключение профилирования с уничтожением всех накопленных данных;
- INFO = profile – возвращает структуру со следующими полями:
- file – полный путь к профилируемому файлу;
- interval – интервалы времени в секундах;
- count – вектор измерений;
- state – состояние профилировщика: 'on' (включен) или 'off' (выключен).
Ниже приводится пример на профилирование m-файла ellipj (эллиптическая функция Якоби):
>
>
profile
on
>
>
profile ellipj
>
>
ellipj([
0
:
0.01
:
1
].
0.5
);.
>
>
profile report
Total time
in
"C:\MATLAB\toolbox\matlab\specfun\ellipj.m"
:
0.16
seconds
100
%
of the total time was spent
on
lines:
[
96
97
86
]
85
:
if
-
isempty(
in
)
0.01s
.
6
%
86
: phin(i.
in
)
=
0.5
*
...
87
:(asin(c(i
+
l.
in
).
*
sin(rem(phin(i
+
l.
in
).
2
*
pi)).
/
a(i
+
l,
in
))
95
: ml
=
find(m
=
=
l):
0.11s
.
69
%
96
: sn(ml)
=
tanh(u(ml)):
0.04s
.
25
*
97
:
cn(ml)
=
sech(u(ml));
98
: dn(ml)
=
sech(udnl)):
>
>
INFO
=
profile INFO
=
file:
'C:\MATLAB\toolboxNmatlab\specfun\el11pj.m'
interval:
0.0100
count: [
98x1
double]
state:
'off'
>
>
profile plot
Нетрудно заметить, что при профилировании выводятся номера строк программы, у которых время выполнения превосходит 0.01 с. С использованием этого интервала и оценивается время исполнения программного кода. Последняя команда выводит графическую диаграмму профилирования, показанную на рис. 21.1.
Рис. 21.1. Графическое представление результатов профилирования
При графическом представлении профилирования по горизонтальной оси указываются номера строк, а по вертикальной – время их выполнения. Сначала показываются строки с наибольшим временем выполнения. Таким образом, программист, отлаживающий работу программы, имеет возможность наглядно оценить, где именно находятся критические по быстродействию фрагменты.