2014-01-12 1 views
-1

Существует простой способ известково продолжительность любой функции, описанную здесь: How to Calculate Execution Time of a Code Snippet in C++Темы: Как точно рассчитать время выполнения алгоритма (продолжительность функции) в C или C++?

start_timestamp = get_current_uptime(); 
// measured algorithm 
duration_of_code = get_current_uptime() - start_timestamp; 

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

Так что вопрос: как рассчитать время, которое потратить на другие темы? OSX код preffer. Хотя это здорово смотреть на окна или код Linux ...

upd: Идеально? концепция кода

start_timestamp = get_this_thread_current_uptime(); 
// measured algorithm 
duration_of_code = get_this_thread_current_uptime() - start_timestamp; 
+0

Почему это будет время выполнения других потоков? – herohuyongtao

+0

Почему этот помеченный RTOS, но OSX-код предпочтительнее? OSX не является RTOS. – Clifford

+0

Вы правы. OSX не является ОСРВ. Это только мягкая RTOS. Моя вина. Я обновил вопрос. – Speakus

ответ

1

Прошу прощения, что в общем случае невозможно сделать то, что вы хотите. Вы ищете worst-case execution time, и есть несколько способов получить хорошее приближение для этого, но нет идеального способа, поскольку WCET эквивалентен Halting problem.

+0

Не могли бы вы упомянуть некоторые методы из нескольких, чтобы получить хорошее приближение для этого? – Speakus

+0

Это очень активная область исследований, поэтому выбивайте себя из себя: http://scholar.google.dk/scholar?hl=ru&as_sdt=0,5&q=worst+case+execution+time – jbr

1

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

Другая идея - полностью отключить прерывания. Это может удалить из вашего измерения другие потоки и прерывания. Но с отключенными прерываниями прерывание таймера может работать неправильно. Поэтому вам необходимо настроить аппаратный таймер соответствующим образом и опираться на регистр значений счетчика таймера (а не на любое значение времени, полученное от прерывания таймера), чтобы измерить время. Также убедитесь, что ваша функция не вызывает никаких процедур RTOS, которые позволяют использовать контекстный переключатель. И не забудьте восстановить прерывания в конце вашей функции.

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

Другая идея - установить вывод GPIO при входе и очистить его при выходе из функции. Затем следите за выводом GPIO с помощью осциллографа (или логического анализатора). Используйте осциллограф, чтобы измерить период, когда высокий контакт GPIO. Чтобы удалить время, потраченное в других потоках, вам нужно будет изменить процедуру планировщика RTOS, которая будет выбирать поток для запуска. Очистите вывод GPIO в планировщике, когда выполняется другой поток, и установите его, когда планировщик вернется в поток вашей функции. Вы также можете рассмотреть возможность очистки выводов GPIO в обработчиках прерываний.

+1

Отключение прерываний может отключить * таймер * прерывания слишком. Лучше отключить приоритет нити. +1 для использования области видимости. – Roddy

+0

@ Родди, спасибо, я согласен с тобой. Я отредактировал свой ответ. – kkrambo

0

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

RTOS часто предоставляют способы для этого. В Windows CE все, что работает с приоритетом 0 (теоретически), не будет вытеснено другим потоком, если только он не вызывает вызов функции/os api/library, требующий обслуживания из другого потока.

Я не супер familer с OSx, но, взглянув на документацию, OSX - это «мягкая» операционная система реального времени. Это означает, что технически то, что вы хотите, не может быть гарантировано.ОС может решить, что есть что-то более важное, чем ваш процесс, чтобы НЕОБХОДИМЫ.

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

Mac OS X Scheduling documentation приводятся примеры о том, как настроить в режиме реального времени темы

0

OSX не является ОС реального времени, поэтому вопрос mistitled и mistagged.

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

Один из подходов состоит в том, чтобы сделать много повторных испытаний и получить наименьшее полученное значение, поскольку это, вероятно, будет тот, где произошло наименьшее количество предварительных ошибок. Это также поможет установить процесс с наивысшим приоритетом, чтобы свести к минимуму количество предварительных условий. Но помните, что на GPOS произойдет множество прерываний от таких устройств, как мышь, клавиатура и системные часы, и потребляем небольшое (возможно, незначительное) количество времени.

Смежные вопросы