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