Профилирование каждого потока в многопоточной среде - PullRequest
1 голос
/ 16 марта 2009

Есть ли способ узнать фактическое время, потраченное потоком внутри процессора, используя MFC / Win32? Под фактическим временем я имею в виду, что не хочу считать время, потраченное потоком в состояниях, отличных от «Выполнение». Я пробовал метод GetThreadTimes () в Win32 SDK, но не смог получить правильные значения. Я хочу сделать это, потому что я хочу проверить влияние установки ThreadPriority на его планирование, то есть какая разница, если я установлю приоритет потока в THREAD_PRIORITY_BELOW_NORMAL вместо THREAD_PRIORITY_NORMAL?

Вот фактический код:

#include<iostream>
#include <afxwin.h>
#include <afxmt.h>
#include <time.h>



bool bStop = false;
long k1 = 0;
long k2 = 0;



UINT run1(LPVOID param)
{
    while(!bStop)
    {
        for(int i = 0; i < 10; ++i)
        {
            ++k1;
        }
    }


    return 0;
}


UINT run2(LPVOID param)
{
    while(!bStop)
    {
        for(int i = 0; i < 10; ++i)
        {
            ++k2;
        }
    }

    return 0;
}



void main(int argc,char *argv[])
{

    CWinThread* pThread1 =  AfxBeginThread(&run1, NULL, THREAD_PRIORITY_NORMAL);
    CWinThread* pThread2 =  AfxBeginThread(&run2, NULL, THREAD_PRIORITY_BELOW_NORMAL );

    Sleep(3 * 1000);

    bStop = TRUE;

    FILETIME f1,f2,f3,f4;
    GetThreadTimes(*pThread1, &f1,&f2,&f3,&f4);
    CTime t1(f4);



    std::cout<<"K1="<<k1<<"\n";
    std::cout<<"K2="<<k2<<"\n";
    std::cout<<"Thread1 Time="<<t1.GetSecond()<<"sec\n";
    std::cout<<"Exit\n";
}

1 Ответ

1 голос
/ 17 марта 2009

GetThreadTimes () даст вам правильные значения. Проблема в том, что он дает это в структуре FILETIME. Вы должны будете преобразовать структуру FILETIME во время, которое легко отобразить пользователю. Вы можете сделать это с помощью API FileTimeToSystemTime :

SYSTEMTIME stUTC;        
FileTimeToSystemTime(&f4, &stUTC);
std::cout<<"Thread1: Hour:"<<stUTC.wHour<<" Min:"<<stUTC.wMinute<<" Sec:"<<stUTC.wSecond<<" millSec:"<<stUTC.wMilliseconds<<std::endl;

В моей машине вывод был: Thread1: Hour:0 Min:0 Sec:3 millSec:0

Пожалуйста, игнорируйте данные года \ дня, так как FILETIME Содержит 64-разрядное значение, представляющее число интервалов в 100 наносекунд с 1 января 1601 года (UTC).

Не забудьте добавить время Kernerl и время пользователя, чтобы получить общее время.

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