После выполнения программы в цикле (SIL) или процессора в цикле (PIL) можно анализировать данные во время выполнения с помощью методов из coder.profile.ExecutionTime
и coder.profile.ExecutionTimeSection
классы.
В следующем примере выполняется выполнение SIL и применение предоставленных методов к данным во время выполнения.
Запустите выполнение SIL, чтобы сгенерировать данные времени выполнения
Копировать MATLAB® код в рабочую папку.
src_dir = ... fullfile(docroot,'toolbox','coder','examples','kalman'); copyfile(fullfile(src_dir,'kalman01.m'), '.') copyfile(fullfile(src_dir,'test01_ui.m'), '.') copyfile(fullfile(src_dir,'plot_trajectory.m'), '.') copyfile(fullfile(src_dir,'position.mat'), '.')
Создайте coder.EmbeddedCodeConfig
объект.
config = coder.config('lib'); config.GenerateReport = true; % HTML report
Сконфигурируйте объект для SIL и включите профилирование времени выполнения.
config.VerificationMode = 'SIL';
config.CodeExecutionProfiling = true;
Если необходимо сгенерировать профили времени выполнения для функций, вызываемых в функциях точки входа, необходимо также отключить библиотеку OpenMP.
config.CodeProfilingInstrumentation = true; config.EnableOpenMP = false;
Сгенерируйте код библиотеки для kalman01
Функция MATLAB и интерфейс SIL.
codegen('-config', config, '-args', {zeros(2,1)}, 'kalman01');
Запустите тестовый файл MATLAB test01_ui
с kalman01_sil
. kalman01_sil
SIL-интерфейс для kalman01
.
coder.runTest('test01_ui', ['kalman01_sil.' mexext]);
Вы видите следующее сообщение.
### Starting SIL execution for 'kalman01' To terminate execution: clear kalman01_sil Execution profiling data is available for viewing. Go to Simulation Data Inspector. Execution profiling report available after termination. Current plot released
Завершает процесс выполнения SIL. Щелкните ссылку clear kalman01_sil
.
### Stopping SIL execution for 'kalman01'
Execution profiling report: report(getCoderExecutionProfile('kalman01'))
Создайте переменную рабочей области, которая содержит данные времени выполнения
Используйте getCoderExecutionProfile
функция для создания переменной рабочей области, которая содержит данные профилирования времени выполнения.
executionProfile=getCoderExecutionProfile('kalman01');
Используйте Sections
способ.
allSections = executionProfile.Sections
allSections = 1x3 ExecutionTimeTaskSection array with properties: Name Number ExecutionTimeInTicks SelfTimeInTicks TurnaroundTimeInTicks TotalExecutionTimeInTicks TotalSelfTimeInTicks TotalTurnaroundTimeInTicks MaximumExecutionTimeInTicks MaximumExecutionTimeCallNum MaximumSelfTimeInTicks MaximumSelfTimeCallNum MaximumTurnaroundTimeInTicks MaximumTurnaroundTimeCallNum NumCalls ExecutionTimeInSeconds Time
Извлечение данных о времени выполнения из определенной секции кода
Укажите секцию кода, который вы хотите изучить.
secondSectionProfile = executionProfile.Sections(2)
secondSectionProfile = ExecutionTimeTaskSection with properties: Name: 'kalman01' Number: 2 ExecutionTimeInTicks: [1x300 uint64] SelfTimeInTicks: [1x300 uint64] TurnaroundTimeInTicks: [1x300 uint64] TotalExecutionTimeInTicks: 6641016 TotalSelfTimeInTicks: 6641016 TotalTurnaroundTimeInTicks: 6641016 MaximumExecutionTimeInTicks: 48864 MaximumExecutionTimeCallNum: 158 MaximumSelfTimeInTicks: 48864 MaximumSelfTimeCallNum: 158 MaximumTurnaroundTimeInTicks: 48864 MaximumTurnaroundTimeCallNum: 158 NumCalls: 300 ExecutionTimeInSeconds: [1x300 double] Time: [300x1 double]
Можно извлечь определенные свойства, например, имя профилированной функции.
nameOfSection = secondSectionProfile.Name
nameOfSection = 'kalman01'
В следующей таблице перечислены сведения, которые можно извлечь из каждой секции кода.
Свойство | Описание |
---|---|
Name | Имя функции точки входа |
Number | Номер секции кода |
ExecutionTimeInTicks | Вектор времен выполнения, измеренный в таймере тактов. Каждый элемент содержит различие между считыванием таймера в начале и в конце секции кода. Тип данных является совпадающим типом данных, что и тип данных таймера, используемого в целевом устройстве, что позволяет вам вывести максимальную область значений измерений таймера. |
SelfTimeInTicks | Вектор чисел такта таймера. Каждый элемент содержит количество тактов, записанных для секции кода, исключая время, затрачиваемое на вызовы дочерних функций. |
TurnaroundTimeInTicks | Вектор чисел такта таймера. Каждый элемент содержит количество тактов, записанных между началом и концом секции кода. Если код не опережает, это число совпадает со временем выполнения. |
TotalExecutionTimeInTicks | Общее количество тактов, записанных для секции кода за все время выполнения. |
TotalSelfTimeInTicks | Общее количество тактов, записанных для профилированной секции кода за все время выполнения. Однако этот номер исключает время, затрачиваемое на вызовы дочерних функций. |
TotalTurnaroundTimeInTicks | Общее количество тактов, записанных между началом и концом профилированной секции кода за все время выполнения. Если код не опережает, это число совпадает с общим временем выполнения. |
MaximumExecutionTimeInTicks | Максимальное количество тактов, записанных для одного вызова секции кода во время выполнения. |
MaximumExecutionTimeCallNum | Количество вызовов, в которых MaximumExecutionTimeInTicks происходит. |
MaximumSelfTimeInTicks | Максимальное количество тактов, записанных для вызова одной секции кода, но исключающих время, затраченное на вызовы дочерних функций. |
MaximumSelfTimeCallNum | Количество вызовов, в которых MaximumSelfTimeInTicks происходит. |
MaximumTurnaroundTimeInTicks | Максимальное количество тактов, записанных между началом и концом одного вызова профилированной секции кода во время выполнения. Если код не опережает, это время совпадает с максимальным временем выполнения. |
MaximumTurnaroundTimeCallNum | Количество вызовов, в которых MaximumTurnaroundTimeInTicks происходит. |
NumCalls | Общее количество вызовов секции кода за все время выполнения. |
ExecutionTimeInSeconds | Вектор времен выполнения, измеренный в секундах. Каждый элемент содержит различие между считыванием таймера в начале и в конце секции кода. Производится только в том случае, если TimerTicksPerSecond задан. |
Time | Вектор измерений времени выполнения для секции кода. |
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.