记录时间的函数
DWORD WINAPI GetTickCount(void);
ULONGLONG WINAPI GetTickCount64(void);
返回从操作系统启动到现在的毫秒数
记录线程时间
BOOL WINAPI GetThreadTimes(
__in HANDLE hThread, // 线程句柄
__out LPFILETIME lpCreationTime, // 创建时间
__out LPFILETIME lpExitTime, // 退出时间
__out LPFILETIME lpKernelTime, // 内核模式下运行时间
__out LPFILETIME lpUserTime // 用户模式下运行时间
);
时间是单位:100ns
记录进程时间
BOOL WINAPI GetProcessTimes(
__in HANDLE hProcess, // 进程句柄
__out LPFILETIME lpCreationTime, // 创建时间
__out LPFILETIME lpExitTime, // 退出时间
__out LPFILETIME lpKernelTime, // 内核模式下运行时间
__out LPFILETIME lpUserTime // 用户模式下运行时间
);
时间是单位:100ns
例程1:记录线程运行时间,不是准确时间(有时间片切换)
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
DWORD WINAPI ThreadProFunc(LPVOID lpParam);
int main(int argc, char **argv)
{
HANDLE hThread;
DWORD dwThreadId;
hThread = CreateThread( NULL, NULL, ThreadProFunc, NULL, 0, &dwThreadId);
CloseHandle(hThread);
system("pause");
return 0;
}
DWORD WINAPI ThreadProFunc(LPVOID lpParam)
{
DWORD timeStart, timeEnd;
timeStart = GetTickCount(); //记录操作系统开机到现在的时间
for(int i = 0; i < 10000; i++) {
for(int j = 0; j < 10000; j++)
{
//
}
}
timeEnd = GetTickCount();
printf("thread exec = %dms\n",timeEnd-timeStart);
return 0;
}
运行结果
请按任意键继续. . . thread exec = 204ms
例程2:准确记录线程运行时间,(不记录时间片) #include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
DWORD WINAPI ThreadProFunc(LPVOID lpParam);
int main(int argc, char **argv)
{
HANDLE hThread;
DWORD dwThreadId;
hThread = CreateThread( NULL, NULL, ThreadProFunc, NULL, 0, &dwThreadId);
CloseHandle(hThread);
system("pause");
return 0;
}
DWORD WINAPI ThreadProFunc(LPVOID lpParam)
{
FILETIME creationTimeStart;
FILETIME exitTimeStart;
FILETIME kernelTimeStart;
FILETIME userTimeStart;
FILETIME creationTimeEnd;
FILETIME exitTimeEnd;
FILETIME kernelTimeEnd;
FILETIME userTimeEnd;
GetThreadTimes(GetCurrentThread() // 获取当前运行线程句柄
, &creationTimeStart
, &exitTimeStart
, &kernelTimeStart
, &userTimeStart );
for(int i = 0; i < 10000; i++) {
for(int j = 0; j < 100000; j++)
{
//
}
}
GetThreadTimes(GetCurrentThread()
, &creationTimeEnd
, &exitTimeEnd
, &kernelTimeEnd
, &userTimeEnd );
SYSTEMTIME kernelSysTimeDiff;
FILETIME kernelFileTimeDiff;
SYSTEMTIME userSysTimeDiff;
FILETIME userFileTimeDiff;
kernelFileTimeDiff.dwHighDateTime = kernelTimeEnd.dwHighDateTime - kernelTimeStart.dwHighDateTime;
kernelFileTimeDiff.dwLowDateTime = kernelTimeEnd.dwLowDateTime - kernelTimeStart.dwLowDateTime;
userFileTimeDiff.dwHighDateTime = userTimeEnd.dwHighDateTime - userTimeStart.dwHighDateTime;
userFileTimeDiff.dwLowDateTime = userTimeEnd.dwLowDateTime - userTimeStart.dwLowDateTime;
FileTimeToSystemTime(&kernelFileTimeDiff, &kernelSysTimeDiff); // 将 FILETIME 时间 转换为 SYSTEMTIME 是啊金
FileTimeToSystemTime(&userFileTimeDiff, &userSysTimeDiff);
printf("thread kernel exec time = %d\n", kernelSysTimeDiff.wSecond); // 内核层运行时间
printf("thread user exec time = %d\n", userSysTimeDiff.wSecond); // 应用层运行时间
return 0;
}
运行结果
请按任意键继续. . . thread kernel exec time = 0
thread user exec time = 1
版权声明:本文为youshijian99原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。