您的位置:首页 > 其它

简易的windows下命令行统计程序运行时间程序

2010-11-19 20:48 465 查看
熟悉的Unix的朋友都知道Unix下有一个功能强大的 time 函数。但是在windows下是没有这样的程序的。
本文参考了别人的写的这种程序并做了改进。
1. 剖析命令行参数需要用gcc的getopt(argc,argv,"hE:p:s") 函数: (PS: 没有GCC 环境的同学可以用IBM写的一个windows下的getopt 程序,附件中会给出来。)
int opt = 0;
while((opt=getopt(argc,argv,"hE:p:s"))!=-1)
{
switch (opt)
{
case 'h':
usage(); //输出帮助信息
return 0;
case 'p':
strcpy(param, optarg); //待统计的程序的启动参数
break;
case 'E':
strcpy(file, optarg); //待统计的程序的路径名称
break;
default:
err_msg(); //出错信息
return 0;
}
}


2. 根据路径启动程序. 这里看到有人用 ShellExecute 来实现。这样实现有个缺点就是无法把程序的输出展现在当前命令行窗口中。所以我用CreateProcess 来启动程序,同时把程序的输出重定位到标准输出窗口(STDOUT)就可以了。
STARTUPINFO s={sizeof ( s ) };
s.dwFlags =STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
s.hStdOutput =GetStdHandle(STD_OUTPUT_HANDLE);  //输出重新定位到标准输出
s.wShowWindow =SW_HIDE;
PROCESS_INFORMATION pi={0};
if ( CreateProcess (file, (param[0] == 0) ? NULL : param, NULL, NULL, TRUE, 0, NULL, NULL, &s, &pi) )
{
WaitForSingleObject ( pi.hProcess ,INFINITE );
CloseHandle ( pi.hThread );
CloseHandle(pi.hProcess);
}


3. 统计时间。这里有很多统计方法: GetTickCount () 或者用更精确的 QueryPerformanceCounter() 和 QueryPerformanceFrequency() 来统计时间。但是MS 提供一个API GetProcessTimes() 可以精确统计这个进程的核心态和用户态时间,所以这里用这个来实现。

FILETIME createTime, exitTime, kernelTime, userTime;
GetProcessTimes(pi.hProcess, &createTime, &exitTime, &kernelTime, &userTime);

printf("/n---------------over----------------------------------/n");
printf("Kernel Time: %dms/n", kernelTime.dwLowDateTime);
printf("User   Time: %dms/n", userTime.dwLowDateTime);
printf("Total  Time: %dms/n", exitTime.dwLowDateTime - createTime.dwLowDateTime);


最后放上效果照片和源程序。

图片查看

源码下载

总结:
l 学习了 getopt 的使用和源码
l 熟悉了进程创建和输出重定位
l 学习了获取进程运行时间以及QueryPerformanceCounter() 和 QueryPerformanceFrequency()用法。

(转载请注明出处)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: