время измерения профилированной функции «Сон» - PullRequest
1 голос
/ 03 января 2011

Несколько дней назад я опубликовал этот вопрос: измерение времени профилируемой функции

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

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

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

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

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

спасибо:)

Ответы [ 2 ]

4 голосов
/ 03 января 2011

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

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

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


Все это говорит:

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

0 голосов
/ 03 января 2011

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

...