После программного обеспечения в цикле (SIL) или процессоре в цикле (PIL) выполнение, можно анализировать методы использования данных времени выполнения от классов coder.profile.ExecutionTimeSection
и coder.profile.ExecutionTime
.
В следующем примере вы запускаете выполнение 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;
Сгенерируйте код библиотеки для функции MATLAB kalman01
и интерфейса 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.