我知道这个问题已被问过几次,但是他们都没有真正帮助我,所以再问一遍。
我正在使用Windows XP并运行visual studio c ++ 2008。
我正在寻找的所有代码都是使用time.h但我认为可能在这里没有正常工作,因为结果让我怀疑。
所以这就是我想要的。
star time = get time some how (this is my question)
my code
end time = get time some how (this is my question)
time passed = start time - end time
答案 0 :(得分:8)
以下是我用来以毫秒为单位打印时间的内容。
void StartTimer( _int64 *pt1 )
{
QueryPerformanceCounter( (LARGE_INTEGER*)pt1 );
}
double StopTimer( _int64 t1 )
{
_int64 t2, ldFreq;
QueryPerformanceCounter( (LARGE_INTEGER*)&t2 );
QueryPerformanceFrequency( (LARGE_INTEGER*)&ldFreq );
return ((double)( t2 - t1 ) / (double)ldFreq) * 1000.0;
}
像这样使用:
_int64 t1;
StartTimer( &t1 );
// do some stuff
printf( "Time = %.3f\n", StopTimer( t1 ));
答案 1 :(得分:4)
您需要一个高精度计时器。如果是Visual Studio,请使用QueryPerformanceCounter。
如果精度仍然不够,请使用编译器内含:
#include <intrin.h>
#pragma intrinsic(__rdtsc)
unsigned __int64 ticks = __rdtsc();
请参阅有关内在here的信息。
这两种解决方案都只是Windows,后者可能只是MSVC。如果需要,我可以为GCC / Linux发布类似的解决方案。
答案 2 :(得分:1)
如果您使用的是Windows,GetTickCount()
功能可以方便地获得分辨率超过1秒的计时器。 GetTickCount
的分辨率取决于您的操作系统,但可能介于10毫秒到16毫秒之间。
请注意,对于快速操作,执行一次代码是不够的。您的代码可能会以0.02毫秒的速度运行,这意味着您将从GetTickCount
等计数器中获得0。您的代码可能执行的时间不足以使计时器“勾选”到下一个值。解决方案是在一个循环中运行你的代码一百万次或其他什么,整个时间,然后除以一百万。
答案 3 :(得分:1)
通常人们做这样的事情来测量一些小的时间间隔:
t0 = getTime();
for(int i = 0; i<1000000; ++i) {
your code
}
t1 = getTime();
timePassed = (t1-t0)/1000000;
答案 4 :(得分:0)
Kornel建议使用QueryPerformanceCounter是一个很好的建议。
如果这对您不起作用,并且您不介意其他仅限Windows的解决方案,请使用Windows“多媒体计时器”。在Visual Studio帮助文件中搜索“timeBeginPeriod”,“timeEndPeriod”和“使用多媒体计时器”。
要使用多媒体计时器,您需要在winmm.lib中包含标题和链接:
#include <mmsystem.h>
#pragma comment( lib, "winmm" ) // need this library for multimedia timers
答案 5 :(得分:0)
这是一个可移植,独立,简短的实现,正是您所需要的:http://cplusplus.co.il/2009/08/19/portable-measurement-of-execution-time/
如果分辨率不够好,你应该多次执行测试。
答案 6 :(得分:0)
这是有效的
#include <windows.h>
SYSTEMTIME startTime;
GetSystemTime(&startTime);
WORD startmillis = (startTime.wSecond * 1000) + startTime.wMilliseconds;
// Do some stuff
SYSTEMTIME endTime;
GetSystemTime(&endTime);
WORD endmillis = (endTime.wSecond * 1000) + endTime.wMilliseconds;
WORD millis = startmillis - endmillis ;