Иногда нужно знать, сколько времени затрачивает поток на выполнениетой или иной операции Многие в таких случаях пишут что-то вроде этого:
// получаем стартовое время
DWORD dwStartTime = GetTickCount();
// здесь выполняем какой-нибудь сложный алгоритм
// вычитаем стартовое время из текущего
DWORD dwElapsedTime = GetTickCount() - dwSlartTime;
Этот код основан на простом допущении, что он нс будет прерван. Но в операци онной системе с вытесняющей многозадачностью никто не знает, когда поток полу чит процессорное время, и результат будет сильно искажен. Что нам здесь нужно, так это функция, которая сообщает время, затраченное процессором на обработку дан ного потока. К счастью, в Windows есть такая функция:
BOOL GetThreadTimes( HANDLE hThread, PFILETIME pftCreationTime, PFILETIMt pftExitTime, PFILETIME pftKernelTime, PFIIFTIME pftUserTime);
GetThreadTimes возвращает четыре временных параметра:
Показатель времени |
Описание |
Время coздания (creation time) |
Абсолютная величина, выраженная в интервалах по 100 нс. Отсчитывается с полуночи 1 января 1601 года по Гринвичу до момента создания потока |
Время завершении (exit time) |
Абсолютная величина, выраженная в интервалах по 100 нс Отсчитывается с полуночи 1 января 1601 года по Гринвичу до момента завершения потока. Если поток все еще выполняется, этот показатель имеет неопределенное значение |
Время выполнения ядра (kernel time) |
Относительная величина, выраженная в интерва лах по 100 нс. Сообщает время, затраченное этим потоком на выполнение кода операцион ной системы |
Бремя выполнения User (User time) |
Относительная величина, выраженная в интерва лах по 100 не Сообщает время, затраченное по током на выполнение кода приложения. |
С помощью этой функции можно определить время, необходимое для выполне ния сложного алгоритма:
_int64 FileTimeToQuadWord(PFILETIME ptt)
{
return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
void PerformLongOperation ()
{
FILETIME ftKernelTimeStart, ftKernelTimeEnd;