После выполнения программы в цикле (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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.