VS C++ 线程篇之六线程时间的函数

记录时间的函数

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版权协议,转载请附上原文出处链接和本声明。