exponenta event banner

Профилируйте свой код, чтобы повысить производительность

Что такое профилирование?

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

Можно профилировать код в интерактивном режиме с помощью профилировщика MATLAB или программно с помощью profile функция. Дополнительные сведения о программном профилировании кода см. в разделе profile. При профилировании кода, выполняющегося параллельно, для получения наилучших результатов используйте параллельный профилировщик Parallel Computing Toolbox™. Дополнительные сведения см. в разделе Профилирование параллельного кода (панель инструментов параллельных вычислений).

Совет

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

Профилировать код

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

  1. Запустите профилировщик в коде.

  2. Просмотрите результаты сводки профиля.

  3. Исследовать функции и отдельные строки кода.

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

  4. Сохраните результаты профилирования.

  5. Реализация потенциальных улучшений производительности в коде.

    Например, при наличии load оператор в цикле, вы можете переместить load оператор вне цикла, так что он вызывается только один раз.

  6. Сохраните файлы и запустите clear all. Снова запустите приложение Profiler и сравните результаты с исходными результатами.

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

Запуск профилировщика по коду

Для запуска профилировщика по строке кода:

  1. На вкладке Главная в разделе Код щелкните Выполнить и время, чтобы открыть профилировщик. Также можно ввести profile viewer в окне команд.

  2. Перейдите на вкладку «Профилировщик» и в разделе «Профиль» введите код, который требуется профилировать, в поле редактирования.

    Например, создайте функцию solvelotka.m который находит пики популяции добычи и хищников для примера Лотка-Вольтерра, предоставленного с MATLAB:

    function [preypeaks,predatorpeaks] = solvelotka(t0, tfinal, y0)
        [~,y] = ode23(@lotka,[t0 tfinal],y0);
        
        preypeaks = calculatepeaks(y(:,1));
        predatorpeaks = calculatepeaks(y(:,2));
        
    end
    
    function peaks = calculatepeaks(A)
        [TF,P] = islocalmax(A);
        peaks = P(TF);
    end
    Введите этот оператор в поле редактирования для профилирования solvelotka функция:
    [preypeaks,predatorpeaks] = solvelotka(0,15,[20;20])

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

  3. Щелкните Выполнить (Run) и Время (Time).

    По завершении профилирования результаты отображаются в окне «Сводка профиля». Профилированные инструкции также отображаются как выполненные в окне команд.

Для создания профиля файла кода, открытого в редакторе, на вкладке «Редактор» в разделе «Выполнение» нажмите кнопку «Выполнить и время». Профилировщик профилирует файл кода, открытый на текущей вкладке «Редактор», и отображает результаты в сводке профиля.

Просмотр сводных результатов профиля

После запуска профилировщика в коде сводка профиля содержит статистику общего выполнения кода и сводную статистику по каждой вызываемой функции. Например, на рисунке ниже показана сводка профиля для solvelotka функция.

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

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

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

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

КолонкаОписание
Имя функции

Имя функции, вызываемой профилированным кодом.

Требования

Число раз, когда профилированный код вызывает функцию.

Общее время

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

Самостоятельное время

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

Общий график времени

Графический дисплей, показывающий собственное время по сравнению с общим временем.

Чтобы отсортировать таблицу функций по определенному столбцу, щелкните стрелку в заголовке столбца. Например, щелкните стрелку в столбце Имя функции (Function Name), чтобы отсортировать функции по алфавиту. Первоначально результаты отображаются в порядке по общему времени. Для просмотра подробной информации о функции, включая информацию об отдельных строках кода, щелкните по имени функции.

Изучение функций и отдельных строк кода

Чтобы найти потенциальные улучшения в коде, найдите функции в графике пламени или таблице функций, которые используют значительное количество времени или которые вызываются чаще всего. Щелкните по имени функции для отображения подробной информации о функции, включая информацию об отдельных строках кода. Например, щелкните значок solvelotka>calculatepeaks функция. В окне Profiler отображается подробная информация о функции.

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

Чтобы вернуться к разделу Сводка профиля, на вкладке Профилировщик нажмите кнопку Сводка профиля. Также можно щелкнуть на панели «Сводка профиля» в нижней части графика пламени.

После нажатия отдельной функции профилировщик отображает дополнительную информацию в следующих разделах:

РазделПодробнее
График пламени

График пламени, показывающий визуальное представление времени, затраченного MATLAB на выполнение профилированной функции. На графике показана иерархия профилированной функции, включая дочерние функции (отображаемые над текущей функцией) и родительские функции (отображаемые под текущей функцией). Определяемые пользователем функции отображаются синим цветом (), а функции MathWorks - серым ().

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

Родители

Список функций, которые вызывают профилированную функцию, включая количество раз, когда родительская функция называется профилированной функцией.

Щелкните имя функции в списке для отображения подробной информации о функции.

Строки, которые занимают больше всего времени

Список строк кода в профилированной функции, которые использовали наибольшее время обработки.

Щелкните строку кода, чтобы увидеть ее в разделе Список функций в контексте остального кода функции.

Дети

Список всех функций, вызываемых профилированной функцией.

Щелкните имя функции в списке для отображения подробной информации о функции.

Результаты анализатора кода

Список проблем и потенциальных улучшений для профилированной функции.

Результаты покрытия

Статистика покрытия кода о строках кода в функции, выполняемой MATLAB при профилировании.

Список функций

Исходный код функции, если она является файлом кода MATLAB.

Для каждой строки кода список Функция включает следующие столбцы:

  • Время выполнения для каждой строки кода

  • Число выполнения MATLAB строки кода

  • Номер строки.

    Щелкните номер строки в списке Функция (Function), чтобы открыть функцию в редакторе по умолчанию.

  • Исходный код функции. Цвет текста указывает на следующее:

    • Зеленый - комментированные строки

    • Черный - выполненные строки кода

    • Серый - невыполненные строки кода

По умолчанию профилировщик выделяет строки кода с наибольшим временем выполнения. Чем темнее подсветка, тем длиннее выполнялась строка кода. Чтобы изменить критерии выделения, перейдите на вкладку Профилировщик (Profiler) и в разделе Вид (View) щелкните Подсветка (Highlight). Выберите один из доступных параметров подсветки. Например, чтобы выделить строки кода, которые не были запущены, выберите Non coverage вариант.

Сохранить результаты

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

Можно также распечатать результаты из профилировщика, перейдя на закладку Профилировщик и нажав кнопку Печать.

Профилировать несколько операторов в окне команды

Для профилирования нескольких инструкций в окне команд:

  1. Перейдите в командное окно и введите profile on.

  2. Введите и выполните инструкции, которые требуется профилировать.

  3. После выполнения всех операторов введите profile off.

  4. Открытие профилировщика путем ввода profile viewer. Также можно перейти на вкладку Главная и в разделе Код щелкните Выполнить и время.

  5. Просмотрите результаты сводки профиля.

Профилировать приложение

Можно профилировать приложения, созданные в App Designer. Можно также профилировать приложения, поставляемые с продуктами MathWorks, например инструмент «Проектирование и анализ фильтров», входящий в состав Toolbox™ обработки сигналов.

Чтобы профилировать приложение:

  1. Откройте Профилировщик, перейдя на вкладку Главная, и в разделе Код щелкните Выполнить и время. Также можно ввести profile viewer в окне команд.

  2. В разделе «Профиль» панели инструментов профилировщика выберите «Начать профилирование». Убедитесь в отсутствии кода в поле редактирования справа от кнопки.

  3. Запустите приложение.

  4. Используйте приложение.

  5. По завершении нажмите кнопку «Остановить профилирование» на панели инструментов профилировщика.

  6. Просмотрите результаты сводки профиля.

Примечание

Чтобы исключить процесс запуска приложения из профиля, отмените шаги 2 и 3. Другими словами, запустите приложение, прежде чем нажать Начать профилирование.

См. также

|

Связанные темы