Издержки операционной системы при профилировании? - PullRequest
1 голос
/ 09 сентября 2008

Я делаю профилирование кода C в Microsoft VS 2005 на платформе Intel Core-2Duo. Я измеряю время (секунды: миллисекунды), подсчитываемое моей функцией. Но у меня есть некоторые сомнения по поводу точности этого измерения, поскольку операционная система не будет постоянно запускать мое приложение, а вместо этого планирует другие приложения / службы в промежутке между выполнением моего кода. (Хотя у меня нет основных приложений, работающих во время выполнения профиля запустить, все еще окна будут иметь много собственного кода, который он будет запускать, выгружая мое приложение.). Из-за всего этого я считаю, что число профилирования (время, необходимое моему приложению для запуска) не является точным.

Так что мой вопрос - есть ли способ узнать издержки операционной системы, планирование накладных расходов в типичной системе Windows (я использую Windows XP), например. если в моих приложениях указано, что оно работает в течение 60 миллисекунд, то из этих 60 мсек сколько времени действительно использовалось моим приложением. и сколько времени он бездействовал из-за того, что ему предшествовала какая-то другая задача, запланированная ОС?

или

Atleast, есть ли какой-нибудь номер шарового парка, чтобы получить такие накладные расходы ОС, основываясь на вашем опыте, с которым вы сталкивались, делая что-то подобное?

Ответы [ 5 ]

1 голос
/ 09 сентября 2008

Я думаю, у вас будут проблемы с гранулярностью. См. Аналогичные вопросы GetLocalTime () API-разрешение времени и gettimeofday () гарантированно имеет микросекундное разрешение?

Кроме того, вы можете взглянуть на Windows Resource Kits Tools , которые включают timeit.exe (аналогично time в unix / linux), чтобы дать вам истекшее время и время обработки.

1 голос
/ 09 сентября 2008

@ Kogus: Даже если я запускаю внешний отладчик (автономное приложение из командной строки), он все равно может быть прерван ОС и может привести к неправильному измерению времени, затраченного моим приложением.

Не правда ли?

-AD

0 голосов
/ 09 сентября 2008

Лучший способ сделать это - специальный инструмент профилирования. Есть много там. Я не использовал один для C в течение нескольких лет, надеюсь, кто-то еще сможет дать лучший совет. Поскольку вы используете Visual Studio 2005, это может быть хорошим местом для начала: AQ , но я никогда не использовал его.

0 голосов
/ 09 сентября 2008

1 - Добавьте в ваш код некоторую отладочную информацию (включая временные метки) и запустите ее вне отладчика

2 - снова запустить в отладчике

3 - повторите много раз, чтобы получить статистически достоверные данные.

4 - Сравнить.

Если существует значительное различие между средним временем выполнения автономного и отладочного процессов, то вы правы, подозревая ОС (или издержки отладчика самих хуков ...). Если нет разницы, то не парься.

Edit0: Очевидно, что отладочные сообщения имеют свои собственные издержки. Возможно, вы захотите оставить их в коде, даже если вы запускаете из отладчика. Таким образом, и автономный, и отладчик используют один и тот же код.

Edit1: я неправильно понял вопрос. Я думал, что вы обеспокоены тем, что во время отладки ОС может прерывать ваше приложение чаще, чем в обычном режиме выполнения. Если вы хотите узнать, сколько времени фактически потратило ваше приложение на работу, просто сравните время, затраченное на «CPU Time» в диспетчере задач.

Edit2: Сравните время, возвращаемое GetProcessTimes для вашего процесса, с фактическим временем выполнения. Разница - это время, потраченное процессором на кого-то другого.

0 голосов
/ 09 сентября 2008

Предложение

Попробуйте запустить на многопроцессорных системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...