怎样计算程序运行时间

kaishuinanhai 2010-12-30 12:37:25
函数应该怎样写呢,运行程序所花费的时间为准进行对比
...全文
233 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
matrixcl 2010-12-30
  • 打赏
  • 举报
回复
这个看具体要求了

一般函数 执行前 GetTickCount,执行后GetTickCount,数值相减。这个时间精度是以15.625秒单位的,误差较大。timeGetTime更精确一点,精确到毫秒。

如果函数执行时间未达到毫秒级,可以循环多次计算平均耗时。
另外还有QueryPerformanceCounter、QueryPerformanceFrequency,理论上可以取到cpu时钟级别的时间间隔,但考虑函数调用的开销,实际误差比这大多了。但仍然远比毫秒时间精确。
luciferisnotsatan 2010-12-30
  • 打赏
  • 举报
回复
下面这段代码可以用来或者程序运行的时间。
建个控制台程序,把代码考进去。加上头文件
#include <stdio.h>
#include <windows.h>




STARTUPINFO si;
PROCESS_INFORMATION pi;
FILETIME ct;
FILETIME et;
FILETIME kt;
FILETIME ut;
__int64 tm=0;
SYSTEMTIME st;


if(2 > argc)
return 1;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line).
argv[1], // Command line. 命令行的参数
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return 1;
}

// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );




GetProcessTimes(pi.hProcess,&ct,&et,&kt,&ut);


FileTimeToSystemTime(&ct,&st);
printf("Creation Time: %04d-%02d-%02d %02d:%02d:%02d.%03d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
FileTimeToSystemTime(&et,&st);
printf("Exit Time: %04d-%02d-%02d %02d:%02d:%02d.%03d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
tm = (((__int64)kt.dwHighDateTime)<<32) + (__int64)kt.dwLowDateTime;
printf("Kernel Time : %llu ms\n", tm/10000);
tm = (((__int64)ut.dwHighDateTime)<<32) + (__int64)ut.dwLowDateTime;
printf("User Time : %llu ms\n",tm/10000);

// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );



在命令行输入:该程序.exe notepad.exe

notepad.exe退出后会输出相关时间
luciferisnotsatan 2010-12-30
  • 打赏
  • 举报
回复
    FILETIME ct;
FILETIME et;
FILETIME kt;
FILETIME ut;
__int64 ktStart=0;
__int64 utStart=0;
__int64 ktStop=0;
__int64 utStop=0;
LARGE_INTEGER ss,ee,fq;
HANDLE cur;

int i,j,dump;

cur = GetCurrentThread();

QueryPerformanceCounter(&ss); //QueryPerformanceCounter的单位应该是cpu的时间周期时间,1/cpu频率
GetThreadTimes(cur,&ct,&et,&kt,&ut); // 起始时的内核时间和用户时间。不过精度也就10ms级
ktStart = (((__int64)kt.dwHighDateTime)<<32) + (__int64)kt.dwLowDateTime;
utStart = (((__int64)ut.dwHighDateTime)<<32) + (__int64)ut.dwLowDateTime;

// put your code here, such as:
Sleep(10000); //sleep消耗的不是程序所用的时间。scanf函数等待的时间等也一样不是程序消耗的时间
for(i=0;i<10000;i++)
{
dump = 0;
for(j=0;j<10000;j++)
{
dump += j*j;
}
}
// finish

GetThreadTimes(cur,&ct,&et,&kt,&ut); // 结束时的内核时间和用户时间
ktStop = (((__int64)kt.dwHighDateTime)<<32) + (__int64)kt.dwLowDateTime;
utStop = (((__int64)ut.dwHighDateTime)<<32) + (__int64)ut.dwLowDateTime;

printf("Kernel Time: %llu ms\n", (ktStop - ktStart)/10000); //FILETIME的单位是100ns,除10000变ms
printf("User Time: %llu ms\n", (utStop - utStart)/10000);
QueryPerformanceCounter(&ee);
QueryPerformanceFrequency(&fq);
// QueryPerformanceCounter高精度的,但记得并不是代码实际消耗的时间。会把sleep的那10秒也计入。
printf("Time: %llu us\n", (ee.QuadPart-ss.QuadPart)/(fq.QuadPart/1000000));
Defonds 2010-12-30
  • 打赏
  • 举报
回复
调用的时间差
kael_9527 2010-12-30
  • 打赏
  • 举报
回复

LARGE_INTEGER swStart,swStop;
Stopwatch(0,&swStart,&swStop);
运行代码
otime=Stopwatch(1,&swStart,&swStop);
totaltime+=otime;
tmp.Format("%.1f",otime*1000);
函数代码
float CRegDemoDlg::Stopwatch(int start0stop1,LARGE_INTEGER *pstart,LARGE_INTEGER *pstop)
{
static LARGE_INTEGER m_swFreq;
static float elapsedtime=0.0;
static int flag=0;
if(!flag){
QueryPerformanceFrequency(&m_swFreq);
flag=1;
}
if (start0stop1==0) QueryPerformanceCounter(pstart);
else {
QueryPerformanceCounter(pstop);
if (m_swFreq.LowPart==0 && m_swFreq.HighPart==0) elapsedtime = -1;
else {
elapsedtime = (float)(pstop->LowPart - pstart->LowPart);
if (elapsedtime < 0) elapsedtime += 2^32;
elapsedtime /= (m_swFreq.LowPart+m_swFreq.HighPart * 2^32);
}
return elapsedtime;
}
return 0;
}
精度比较高的,希望合用
ryfdizuo 2010-12-30
  • 打赏
  • 举报
回复
clock_t begin = clock();
function();
clock() - begin; // 为时间差,单位ms
野男孩 2010-12-30
  • 打赏
  • 举报
回复
DWORD ticks = GetTickCount();

Function();

ticks = GetTickCount() - ticks;

cout << "Function() cost " << ticks << "ms";

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧