通过C ++代码计算时间

时间:2010-01-31 21:05:50

标签: c++

我知道这个问题已被问过几次,但是他们都没有真正帮助我,所以再问一遍。

我正在使用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

7 个答案:

答案 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 ;