c++计算函数运行时间,c语言高精度运算
//C程序运行时间的高精度计算
#包括iostream
#包含windows.h
使用命名空间std
Void Test()//测试程序
{
for(int I=0;i 1000我)
{
for(int j=0;j j)
{
printf(%d,%d\n ,I,j);
}
}
}
int main(void)
{
LARGE _ INTEGER BegainTime
LARGE_INTEGER结束时间;
LARGE_INTEGER频率;
QueryPerformanceFrequency(频率);
QueryPerformanceCounter(begin time);
//将待测试的代码放在这里
test();
QueryPerformanceCounter(end time);
//输出运行时间(单位:秒)
Cout 运行时间(单位:s):(double)(end time . quad part-begin time . quad part)/frequency . quad part endl;
系统(“暂停”);
返回0;
}
线框中的代码可以实现微秒级的时差计算精度:
-
LARGE _ INTEGER litmp
LONGLONG QPart1,Qpart2
double dfMinus,dfFreq,dfTime
//获取定时器的时钟频率
QueryPerformanceFrequency(litmp);
dfFreq=(double)litmp。QuadPart
QueryPerformanceCounter(litmp);
Qpart1=litmp。QuadPart//开始计时
block 1();//工作模块功能等。根据自己的需求添加。
QueryPerformanceCounter(litmp);
Qpart2=litmp。QuadPart//终止计时
df MINUS=(double)(q part 2-q part 1);//计算计数器值
df time=df MINUS/dff req;//以秒为单位获取相应的时间。您可以将1,000,000乘以毫秒级别(美国)
-
在一些计算机硬件系统中,有高分辨率的性能计数器
计数器),可以用来获得高精度的定时间隔,其精度与CPU的时钟频率有关。
1.首先调用QueryPerformanceFrequency函数,获取高精度运行计数器的频率f。是每秒的次数(n/s)。这个号码
一般都很大。
2.在需要计时的代码两端调用QueryPerformanceCounter,获取高精度运行计数器的值n1,n2。两次
值差用f换算成时间间隔,t=(n2-n1)/f。
这里有一个例子来说明这种方法的使用及其准确性。
在VC 6.0下,用MFC构建一个对话框项目,命名为HightTimer。对话框面板中控件的布局如下:
它包含两个静态文本框、两个编辑框和两个按钮。上下位置的编辑框id分别为IDC_E_TEST和IDC_E_ACT。
UAL,MFC ClassWizard添加的成员变量也分别对应DWORD m_dwTest和DWORD m_dwAct。
“退出”按钮的ID为IDOK,“开始测试”按钮的ID为IDC_B_TEST。使用MFC。
ClassWizard添加该按钮的点击消息处理功能如下:
void CHightTimerDlg:ontest()
{
//TODO:在此添加控件通知处理程序代码
update data(TRUE);//将输入的测试时间值放入与编辑框关联的成员变量m_dwTest中
大整数频率;//LARGE_INTEGER是并集,其中LOWPART是低32位,HIGHPART是高32位,
//两者构成一个结构,QuadPart是其中的一个64位有符号整数,类型为LongLong。
如果(!QueryPerformanceFrequency(frequency))//取高精度运行计数器的频率,如果硬件不支持则返回FALSE。
MessageBox(您的计算机硬件不支持高分辨率性能计数器,
不支持,MB _ icon感叹号 MB _ OK);
LARGE_INTEGER测试,ret
测试。四部分=频率。quad part * m _ dw test/1000000;
//以变频微秒数(与CPU时钟有关)计数到相应的数,1秒=1000000微秒
//test存储m_dwTest毫秒所需的次数。
ret=MySleep(测试);//调用此函数启动延时,返回实际开销。
m_dwAct=(DWORD)(1000000 * ret。四部分/频率。quad part);//转换为微秒
update data(FALSE);//显示到对话框面板
}
上面调用的MySleep函数如下:
LARGE _ INTEGER CHightTimerDlg:my sleep(LARGE _ INTEGER Interval)
///////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//函数:执行实际延迟函数。
//参数:间隔参数为需要执行的延时与时间有关的数量
//返回值:返回此函数执行后实际所用的时间有关的数量
///////////////////////////////////////////////////////////////////////////////////////////////////
////////
{
大整数隐私、当前、过去
QueryPerformanceCounter(prisious);
当前=隐私;
而(当前。四部分-隐私。四部分间隔。四部分)
QueryPerformanceCounter(t);
逝去QuadPart=当前。四部分-隐私四部分
回归逝去;
}
注:别忘了在头文件中为此函数添加函数声明。
至此,可以编译和执行此工程了,当测试时间超过3微秒时,准确度已经非常高了,此时机器执行本身延时函数代码的时间对需要延时的时间影响很小了。
上面的函数由于演示测试的需要,没有在函数级封装,下面给出的函数基本上可以以全局函数的形式照搬到别的
程序中。
布尔我的睡眠(双字间隔)
///////////////////////////////////////////////////////////////////////////////////////////////////
//////////
//功能:执行微秒级的延时功能
//参数:间隔参数为需要的延时数(单位:微秒)
//返回值:若计算机硬件不支持此功能,返回假的,若函数执行成功,返回真实的
///////////////////////////////////////////////////////////////////////////////////////////////////
////////
{
BOOL bNormal=TRUE
大整数频率、优先级、电流、间隔;
如果(!QueryPerformanceFrequency(频率))
{
MessageBox(空,您的计算机硬件不支持高分辨率性能
计数器,
不支持,MB _ icon感叹号 MB _ OK);//或其它的提示信息
返回错误的
}
间隔。四部分=频率quad部分* dw区间/1000000;
b normal=b normal QueryPerformanceCounter(prisious);
当前=隐私;
而(当前。四部分-隐私。四部分间隔。四部分)
b normal=b normal QueryPerformanceCounter(t);
返回正常
}
需要指出的是,由于在此函数中的代码很多,机器在执行这些代码所花费的时间也很长,所以在需要几个微秒的
延时时,会影响精度。实际上,读者在熟悉这种方法后,只要使用精确计时和查询员
ceCounter这两个函数就能按实际需要写出自己的延时代码了。
给你个类吧,我在用呢
//已过时间。h:枯萎了类的接口。
//
//////////////////////////////////////////////////////////////////////
#如果!已定义(AFX _ ELAPSED _ H _ _ 4a 992 e 21 _ 8b 47 _ 11d 6 _ B1 B2 _ fffce 130 b 010 _ _包括_)
# define AFX _ ELAPSED _ H _ _ 4a 992 e 21 _ 8b 47 _ 11d 6 _ B1 B2 _ fffce 130 b 010 _ _ INCLUDED _
# VER国际机场1000
#杂注一次
#endif //_MSC_VER 1000
类枯萎了
{
私人:
(同Internationalorganizations)国际组织已初始化;
__int64频率;
_ _ int64 BeginTime
公共:
布尔可用().
双端();
BOOL Begin();
CElapsed();
virtual ~ CElapsed();
};
#endif //!已定义(AFX _ ELAPSED _ H _ _ 4a 992 e 21 _ 8b 47 _ 11d 6 _ B1 B2 _ fffce 130 b 010 _ _包括_)
//已过时间。CPP:已枯萎类的实现。
//
//////////////////////////////////////////////////////////////////////
#include stdafx.h
//#包含myimage.h
#include Elapsed.h
#ifdef _DEBUG
#undef THIS_FILE
static char THIS _ FILE[]=_ _ FILE _ _;
#定义新的调试_新
#endif
//////////////////////////////////////////////////////////////////////
//建设/破坏
//////////////////////////////////////////////////////////////////////
塞拉得:塞拉得()
{
initialized=QueryPerformanceFrequency((LARGE _ INTEGER *)Frequency);
}
cela速度:~ cela速度()
{
}
BOOL cela速度:Begin()
{
如果(!已初始化)
返回0;
返回QueryPerformanceCounter((LARGE _ INTEGER *)开始时间);
}
双绉*结束()
{
如果(!已初始化)
返回0;
_ _ int64结束时间
QueryPerformanceCounter((LARGE _ INTEGER *)结束时间);
_ _ int 64 elapsed=结束时间-开始时间;
返回(双精度)已用/(双精度)频率;
}
BOOL cela speed:available()
{
返回已初始化;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。