获取进程启动时间

Posted 牧秦丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取进程启动时间相关的知识,希望对你有一定的参考价值。

我们有时候通过测试一个程序的启动时间来评估程序的性能,那么该怎么办呢?现在提出两种办法,各有优劣,请酌情采纳。


1、通过一个辅助程序调用CreateProcess 启动被测程序,在 CreateProcess命令行参数中传递当前TickCount,在被测程序的main 函数开头获取当前TickCount,并从命令行参数中解出启动进程的TickCount,执行减法即可;


2、通过Windows API实现,需要用到的API 有:GetProcessTimesFileTimeToSystemTimeGetSystemTimeGetCurrentProcess 等,不清楚的API请查看MSDN 或者查看官方文档。


方法1:

// helper exe.
//
// ...
DWORD dwStartTime = ::GetTickCount();
char szBuffer[20] = 0;
sprintf_s(szBuffer, 20, "xxx.exe %u", dwStartTime);

STARTUPINFO sa = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;

::CreateProcess(
	"",
	szBuffer,
	NULL, NULL, NULL,
	CREATE_NEW_CONSOLE,
	NULL, NULL,
	&si, &pi
	);


// xxx.exe
//
#include <iostream>
using namespace std;


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

	DWORD dwStartFinishTime = ::GetTickCount();
	
	if (argc >= 2)
	
		DWORD dwStartBeginTime = atoi(argv[1]);
		cout<<"Start Used Time: "<<dwStartFinishTime - dwStartBeginTime<<" ms"<<endl;
	
	
	// ...
	
	return 0;

方法二:

#include <iostream>
#include <Windows.h>
using namespace std;


int main()

	SYSTEMTIME endTime;
	::GetSystemTime(&endTime);
	
	FILETIME loadStartTime, exitTime, kernelTime, userTime;
	HANDLE hProcess = ::GetCurrentProcess();
	::GetProcessTimes(hProcess, &loadStartTime, &exitTime, &kernelTime, &userTime);
	
	SYSTEMTIME beginTime;
	::FileTimeToSystemTime(&loadStartTime, &beginTime);
	DWORD dwBeginTime =
		beginTime.wHour * 60 * 60 * 1000
		+ beginTime.wMinute * 60 * 1000
		+ beginTime.wSecond * 1000
		+ beginTime.wMilliseconds;
	DWORD dwEndTime =
		endTime.wHour * 60 * 60 * 1000
		+ endTime.wMinute * 60 * 1000
		+ endTime.wSecond * 1000
		+ endTime.wMilliseconds;
	
	cout<<"Start Used Time: "<<dwEndTime - dwBeginTime<<" ms"<<endl;

	return 0;


在第二种方法中,我们通过 GetProcessTimes 取得进程启动时间,然后通过函数 FileTimeToSystemTimeFILETIME转换成 SYSTEMTIME,然后得到与当前系统时间的差值即可。


需要注意的是,第一种方法得到的是调用 CreateProcess 之前的那个时间戳,所以精度上可能不够精确(天晓得调用 CreateProcess 函数中做了什么);第二种方法在时间转换上较麻烦,可能还要在 dwBeginTime dwEndTime 中加上DayMonthYear






以上是关于获取进程启动时间的主要内容,如果未能解决你的问题,请参考以下文章

源码反码补码

我想在Matlab里求两幅图像的差值图像,该如何做呢?直接减不行啊

启动 Mozilla Firefox 时如何获取进程 ID?

获取进程启动时间

GO 获取两个时间点的差值

如何获取启动进程的命令行