2011-01-03 2 views
1

Несколько дней назад я отправил этот вопрос: measuring time of a profiled functionвремя функции профилированного «Sleep» измерение

(я надеюсь, что это нормально, я буду открывать новую тему, я просто не могу найти старую в несколько первых страниц)

Я заметил, что в моем профилированном процессе я называю метод «Сон» - и это проблема ... Когда я вызываю SuspendThread/ResumeThread - процесс «Спящий» приостанавливается, но на самом деле - время движется!
Я полагаю, что «Сон» - это просто какой-то цикл, который занимает время и останавливается всякий раз, когда разница между временем начала и временем окончания достаточно велика.

хорошо, предположим, что ваш профилированный процесс должен спать в течение 1 минуты.
Вы приостановили профилированный процесс после сна 2 секунды и пошли что-нибудь съесть.
Вы вернулись через 15 минут и возобновили профилированный процесс.
Профилированный процесс измеряет время, находит, что БОЛЕЕ 1 минута прошла, и он перестает спать.

, что как я сделал сон процесс слишком мало (время проходит дальше, когда процесс приостановлен, Сон принимает это во внимание - но я не могу) ...

И теперь, наконец, здесь мой вопрос:
Как я могу избежать этой проблемы? Как я могу правильно измерить время таких функций, как «Сон»?

спасибо :)

+2

По дизайну. Сон - это время настенных часов, а не время резьбы. –

+0

Вы всегда можете посмотреть ваши собственные сообщения и найти его - http://stackoverflow.com/questions/4574727/measuring-time-of-a-profiled-function –

+0

Hans @: Есть ли способ получить время потока? Грег @: что в моем последнем посте может помочь мне с этим? – Idov

ответ

4

sleep методы почти никогда не выполняют «спина» механика, которую вы describing- нет причин тратить так много процессорного времени, когда все это действительно нужно сделать, это установить таймер внутри ОС , а затем просто перестаньте работать, пока он не пробудится таймером. Если процесс, который уже заморожен из-за вызова sleep, снова заморожен, потому что вы его приостановили, тогда он просто приостановлен дважды; «будильник» возвращает и приостанавливает приостановку, но приложение все еще приостановлено, потому что вы его приостановили. Если вы откажетесь от него до того, как погаснет sleep, ваш suspend/unsuspend просто не будет иметь никакого эффекта.

По существу, нить никому не нужна или не заботится о том, почему sleep не торопится с ожидаемым. Он просто не запускал код, пока он был sleep ing. Он прекратил работу с кодом, а затем снова начал запускать код, и проверка настенных часов просто скажет, как долго он закончился, а не то, что заставило его замораживаться в течение этого времени. (Возможно, это был низкий приоритет, и ОС была очень занята, и просто потребовалось так много времени, чтобы запланировать ее повторную работу после завершения sleep.)

. Ближайшим, что вы можете сделать, это написать свой собственный метод sleep и использовать его это только для целей отладки. (Вероятно, он должен вызвать системный спящий режим, когда он не находится в режиме отладки, поэтому вам не нужно менять код вне условной компиляции функции с помощью #ifdef DEBUG/#endif.) То, что sleep должно делать именно то, что вы предлагаете: count ticks пока «настенные часы» не скажут, что он достаточно долго ждал, и, если между тиками неожиданно большой разрыв, нажмите крайний срок, потому что это время не «засчиталось».


Все, что сказал:

Может быть, вы задали неправильный вопрос здесь.Почему вы пытаетесь профилировать sleep в любом случае и сделать его стабильным через ручную остановку программы? Точное профилирование, как правило, выходит из окна в любом случае, как только вы замораживаете программу извне - она ​​отбрасывает почти все связанные с хронометрированием свойства программы, особенно в отношении поведения кэша памяти процессора.

+0

Я пишу свой собственный профилировщик, и я запустил его на «Проверка работоспособности», чтобы проверить время. Я действительно пытался приостановить процесс сна (через 2 секунды, пока он должен был спать 1 минута) и ждал несколько минут (написав мой вопрос). когда я возобновил его - он сразу же перестал спать ... поэтому я не понимаю, как он складывается с вашим ответом. :) – Idov

+0

В Windows используется явный механик «suspend count» для потока (или процесса), и пока я не знаю, явно ли он является частью Linux (я недостаточно изучил ядро), это полезная абстракция , Выполняется поток с задержкой 0. Когда вызывается 'sleep', счетчик приостановки увеличивается на 1, и процесс зависает, потому что количество приостановки превышает 0. Когда таймаут достигает, количество приостанавливается на 1. Когда вы остановили программу, счет приостановки увеличился. Таким образом, при T = -1 приостановить счет S = 0. Сон при T = 0, S = 1. Вы входите в T = 2, S = 2 для вашего перерыва. T = 60, S = 1; резюме @ T = 900, S = 0. –

+0

да! это моя проблема. T = 60 -> S = 1, но T = 60 в реальном времени. поэтому процесс, пока он не приостановлен, будет спать 60-X секунд и X секунд, пока он приостановлен. – Idov

0

Я получил его.
Я просто проверю, приостановлен ли процесс, когда я его приостановил, и если да, я также рассмотрю время моей ручной приостановки.
thanks everbody :)

+0

возможно не ...: / – Idov

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