C++ 通过C+计算时间+;代码
我知道这个问题已经被问了好几次了,但是没有一个能真正帮助我,所以再问一次 我使用Windows XP并运行VisualStudioC++ 2008。< /P> 我正在查找的所有代码都在使用time.h,但我认为可能是它在这里工作不正常,因为结果让我产生怀疑 这就是我想要的C++ 通过C+计算时间+;代码,c++,C++,我知道这个问题已经被问了好几次了,但是没有一个能真正帮助我,所以再问一次 我使用Windows XP并运行VisualStudioC++ 2008。< /P> 我正在查找的所有代码都在使用time.h,但我认为可能是它在这里工作不正常,因为结果让我产生怀疑 这就是我想要的 star time = get time some how (this is my question) my code end time = get time some how (this is my question)
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
你需要一个高精度的计时器。在使用VisualStudio的情况下 如果精度仍然不够,请使用编译器提示:
#include <intrin.h>
#pragma intrinsic(__rdtsc)
unsigned __int64 ticks = __rdtsc();
#包括
#pragma内在(uu rdtsc)
无符号uu int64 ticks=uu rdtsc();
请参阅有关该intristic的信息
这两种解决方案都仅适用于Windows,后者可能仅适用于MSVC。如果需要的话,我可以发布一个类似的GCC/Linux解决方案。如果你在Windows上,这个函数是一个获取分辨率超过1秒的计时器的便捷方法。GetTickCount的分辨率取决于您的操作系统,但可能在10 ms到16 ms之间
请注意,对于快速操作,只执行一次代码是不够的。您的代码可能以0.02毫秒的速度运行,这意味着您将从计数器(如
GetTickCount
)中获得0。您的代码执行时间可能不够长,计时器无法“勾选”下一个值。解决方案是在一个循环中运行代码一百万次或其他,对整个循环计时,然后除以一百万。以下是我用来打印时间(毫秒)的方法
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 ));
Kornel关于使用QueryPerformanceCounter的建议是一个很好的建议 如果这不适用于您,并且您不介意另一个仅适用于Windows的解决方案,请使用Windows“多媒体定时器”。在Visual Studio帮助文件中搜索“timeBeginPeriod”、“timeEndPeriod”和“使用多媒体计时器” 要使用多媒体计时器,您需要包含标题和winmm.lib链接:
#include <mmsystem.h>
#pragma comment( lib, "winmm" ) // need this library for multimedia timers
#包括
#pragma comment(lib,“winmm”)//多媒体计时器需要此库
通常人们会这样做来测量一些小的时间间隔:
t0 = getTime();
for(int i = 0; i<1000000; ++i) {
your code
}
t1 = getTime();
timePassed = (t1-t0)/1000000;
t0=getTime();
对于(int i=0;i,这里有一个可移植的、自包含的、简短的实现,正好满足您的需要:
如果分辨率不够好,您应该执行几次测试。这很有效
#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 ;
#包括
系统时间开始时间;
GetSystemTime(&startTime);
单词startmillis=(startTime.wssecond*1000)+startTime.wmillseconds;
//做点什么
系统时间结束时间;
GetSystemTime(&endTime);
单词endmillis=(endTime.wssecond*1000)+endTime.wmillisonds;
单词millis=开始millis-结束millis;
是什么让你“怀疑”?你的代码执行速度太快,无法达到时间的精度。要捕获它,请使用更精确的解决方案(参见我的答案)如何将其转换为毫秒?@ITSABOOTCODE,不幸的是,对于这样低级别的性能函数,没有确定的方法将其转换为毫秒,因为根据处理器速度的不同,结果会有所不同。您可以先使用Sleep计算滴答数/秒值,然后再进行转换。如果在多核上使用RDTSC,请小心或多内核系统!系统中的每个cpu内核都有一个单独的时间戳计数器,它们可能同步,也可能不同步。通常,需要有一个驱动程序定期同步内核之间的时间戳计数器。除非您显式设置进程的线程关联性,否则操作系统可以自由地将其从一个内核移动到另一个内核如果核心的TSC不同步,你可以从不同的计数器中得到你的开始和停止时间,这种差异可能是完全错误的——甚至是负的!使用RDTSC的另一个问题是,你必须准确地知道你的cpu核心频率是多少,才能将它转换为秒。但是cpu核心时钟不是一个常数!它正在被转换被电源管理系统启动或关闭。我正在使用此功能,但没有结果。@ItsautCode:在捕获“开始”和“结束”之间,您运行了多少次代码时间?只有一次,这很重要,它的代码很长…像6个函数,总共250行代码。@ITSABUOTCODE:请阅读我答案的第二段。只编写一次代码是不够的。