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

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

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

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

Совет

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

Профилируйте свой код

Чтобы профилировать свой код и улучшить его эффективность, используйте этот общий процесс:

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

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

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

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

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

  5. Реализуйте потенциальное повышение эффективности в коде.

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

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

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

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

Чтобы запустить профилировщик на строке кода:

  1. На вкладке Home, в разделе Code , нажмите Run and Time, чтобы открыть профилировщик. Можно также вводить profile viewer в Командном окне.

  2. Перейдите на вкладку Profiler, а в разделе Profile введите код, который необходимо профилировать в поле редактирования.

    Например, создайте функцию solvelotka.m который находит добычу и peaks популяции хищников для примера Лоток-Вольтерра, предоставленного с 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 and Time.

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

Чтобы профилировать файл кода, открытый в редакторе, на вкладке Editor, в разделе Run, нажмите Run and Time. Профилировщик профилирует файл кода, открытый на текущей вкладке Editor, и отображает результаты в сводных данных профилей.

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

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

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

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

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

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

СтолбецОписание
Function Name

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

Calls

Количество вызовов функции профилированным кодом.

Total Time

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

Self Time

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

Total Time Plot

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

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

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

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

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

Чтобы вернуться к Сводным данным профилей, на вкладке Profiler, нажмите кнопку Profile Summary. Можно также щелкнуть на панели Profile Summary в нижней части графика пламени.

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

РазделПодробнее
Flame Graph

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

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

Parents

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

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

Lines that take the most time

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

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

Children

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

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

Code Analyzer results

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

Coverage results

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

Function listing

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

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

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

  • Количество раз, когда MATLAB выполнял строку кода

  • Номер линия.

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

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

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

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

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

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

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

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

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

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

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

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

  2. Введите и запустите операторы, которые вы хотите профилировать.

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

  4. Откройте профилировщик путем ввода profile viewer. Можно также перейти на вкладку Home, а в разделе Code нажмите Run and Time.

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

Профилируйте приложение

Вы можете профилировать приложения, которые вы создаете в App Designer. Можно также профилировать приложения, которые поставляются с продуктами MathWorks, такими как инструмент Создание Фильтра and Analysis, включенный в Signal Processing Toolbox™.

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

  1. Откройте профилировщик, перейдя на вкладку Home, и в Code разделе нажмите Run and Time. Можно также вводить profile viewer в Командном окне.

  2. В Profile разделе панели инструментов Profiler нажмите Start Profiling. Убедитесь, что в поле редактирования справа от кнопки отсутствует код.

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

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

  5. Когда вы закончите, нажмите Stop Profiling на панели инструментов Profiler.

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

Примечание

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

См. также

|

Похожие темы