近来导师让我写一个能准确测试程序运行时间的程序。下面给出我用的两种测试方法:
方法一:插入汇编代码(精度高)
unsigned long HighStart,LowStart,HighEnd,LowEnd;//要是定义成long类型,出现负值的几率很高
unsigned long numhigh,numlow;
//long MaxCycle = 0;
__asm
{
RDTSC
mov HighStart, edx
mov LowStart, eax
}
//获取波门数据
PTNODE pt1, pt2;
pt1.x = m_leftPtX;
pt1.y = m_leftPtY;
pt2.x = pt1.x+m_PcWidth;
pt2.y = pt1.y+m_PcWidth;
BYTE* PTemp = (BYTE*)malloc(m_PcWidth*m_PcWidth);
memset(PTemp, 0, m_PcWidth*m_PcWidth);
pView->myImage->PickAreaData(pDest,PTemp,&pt1, &pt2);
//针对特定区域开始模拟
pView->myImage->SimulateOfVariance(PTemp, m_PcWidth, m_PcWidth);
//拷贝处理后的数据到原位置
pView->myImage->ReplaceAreaBmpData(pDest, PTemp, &pt1, &pt2);
pView->myImage->TransformDataBmp(pDest,pView->myImage->m_pData,
pView->myImage->m_width,pView->myImage->m_height);
//
__asm
{
RDTSC
mov HighEnd, edx
Mov LowEnd, eax
sub eax, LowStart
mov numlow, eax
mov eax,edx
sbb eax,HighStart
mov numhigh,eax
}
__int64 timer =0;
timer |= numhigh;
timer = timer<<32;
timer |= numlow;
m_dTime = (double) (timer /1.99/1000000000);其中1.99/1000000000为电脑频率,比如我机子的CPU频率是1.99GHz。
m_dtime的值就是我们所需要的
方法二,我自己实现了一个类
//.h
class CCalculateTime
{
public:
CCalculateTime();
virtual ~CCalculateTime();
public:
double ReturnSpendTime();//返回最终运行时间
void GetEndPerformanceCounter();//取得结束运行时间
void GetStartPerformanceCounter();// 取得开始运行时间
void GetPerformanceFrequency();/ /取得CPU工作频率
private:
LARGE_INTEGER freq;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
};
//.cpp
CCalculateTime::CCalculateTime()
: QPart1(0),QPart2(0)
,dfMinus(0), dfFreq(0), dfTim(0)
{
}
CCalculateTime::~CCalculateTime()
{
}
void CCalculateTime::GetPerformanceFrequency()
{
QueryPerformanceFrequency(&freq);
dfFreq = (double)freq.QuadPart;
}
void CCalculateTime::GetStartPerformanceCounter()
{
QueryPerformanceCounter(&freq);
QPart1 = freq.QuadPart;
}
void CCalculateTime::GetEndPerformanceCounter()
{
QueryPerformanceCounter(&freq);
QPart2 = freq.QuadPart;
}
double CCalculateTime::ReturnSpendTime()
{
dfMinus = (double)(QPart2-QPart1);
return dfMinus / dfFreq;// 获得对应的时间值,单位为秒
}
测试:
CCalculateTime a;
a.GetPerformanceFrequency();
a.GetStartPerformanceCounter();
//测试的代码
a.GetEndPerformanceCounter();
long spentTime = a.ReturnSpendTime();
这两种方法精度都很高,都是通过处理CPU时钟频率来计算运行时间的。