百度空间 | 百度首页 
 
查看文章
 
如何准确测试程序/算法运行时间(VC中实现)
2007年07月17日 星期二 05:09 P.M.

近来导师让我写一个能准确测试程序运行时间的程序。下面给出我用的两种测试方法:

方法一:插入汇编代码(精度高)

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时钟频率来计算运行时间的。


类别:mfc/c++学习心得体会 | 添加到搜藏 | 浏览() | 评论 (1)
 
最近读者:
 
网友评论:
1
2007年08月28日 星期二 01:56 P.M. | 回复
好认真啊
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu