现在的位置: 首页 > 综合 > 正文

关于计时的一些方法

2013年04月06日 ⁄ 综合 ⁄ 共 2644字 ⁄ 字号 评论关闭
clock函数

C++中的计时函数是clock(),而与其相关的数据类型是clock_t(头文件是time.h)。函数定义原型为:clock_t clock(void);

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。
其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:
   #ifndef _CLOCK_T_DEFINED
   typedef long clock_t;
   #define _CLOCK_T_DEFINED
   #endif
很明显,clock_t是一个长整形数。另外在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,因此,我们就可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间。
  

下面就上面的知识给大家举个例子帮助大家理解。

#include<iostream.h>
#include<time.h>
void main()
{
   clock_t start,finish;
   double totaltime;
   start=clock();
   ……                     //把你的程序代码插入到这里面
   finish=clock();
   totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
   cout<<"\n此程序的运行时间为"<<totaltime<<"秒!"<<endl;
}
   实际上在运行中CLOCKS_PER_SEC的大小为1000;而clock()函数的精度只能达到15ms,这样的精度不能满足程序的要求。

 

 

WINDOWS中的几个函数
1.  使用GetTickCount,得到当前的时间,单位是毫秒 
代码示例:
DWORD startTime = GetTickCount();
//被测试的代码
DWORD totalTime = GetTtickCount() – startTime;
实际在运行中GetTickCount精度只能达到15ms. 
2.使用GetThreadTimes;该函数得到的时间包括两部分,内核执行的时间和用户代码的执行时间。
代码示例:
FILETIME m_ftKernelTimeStart;
FILETIME m_ftKernelTimeEnd;
FILETIME m_ftUserTimeStart;
FILETIME m_ftUserTimeEnd;
GetThreadTimes(GetCurrentThread(),&m_ftDummy,&m_ftDummy,&m_ftKernelTimeStart,&m_ftUserTimeStart);
//被测试的代码
GetThreadTimes(GetCurrentThread(),&m_ftDummy,&m_ftDummy,& m_ftKernelTimeEnd,& m_ftUserTimeEnd);
使用GetThreadTimes得到的时间单位也是毫秒级别的,精度可以达到1ms;

 

 

内联汇编的方法:
/////////////////////////////////////////////////////////////////////////////

// KTimer.h

#pragma once
inline unsigned __int64 GetCycleCount( void )
{
    _asm _emit  0x0F 
    _asm _emit  0x31 
class  KTimer  
{
    unsigned __int64 m_startcycle;
public :
    unsigned __int64 m_overhead;     // RTSC指令的运行时间 
    KTimer()
   {
        m_overhead  =   0 ;
        Start();
        m_overhead  =  Stop();
    } 
    void  Start();
    unsigned __int64 Stop();
    unsigned unsigned GetCPUSpeed();
} ;

 

///////////////////////////////////////////////////////////////////////////// 

//KTimer.cpp
#include "KTimer.h"
#include <iostream>
#include <windows.h>
void KTimer::Start(){
    m_startcycle = GetCycleCount();
}
unsigned __int64 KTimer::Stop()
{
    return GetCycleCount() - m_startcycle - m_overhead;
}
unsigned unsigned KTimer::GetCPUSpeed()
{
    cout << "开始测试 cpu速度.." << endl;
    Start();
    Sleep(1000);
    unsigned cputime = Stop();
    unsigned cpuspeed10 = (unsigned)(cputime/100000);
    cout << "CPU速度 每秒:" << cputime << " clocks" << endl;
    return cpuspeed10 == 0 ? 1 : cpuspeed10;
用法:
#include "stdafx.h"
#include <tchar.h>
#include <windows.h>
#include <iostream>
#include "KTimer.h"
int main(int argc, char* argv[])
{    
    KTimer timer;
    unsigned cpuspeed10 = timer.GetCPUSpeed();
    timer.Start();   
    //做耗时操作  
    unsigned time = timer.Stop();
    TCHAR mess[128];
    wsprintf(mess,_T("耗时:%d ns"), time * 10000 / cpuspeed10);
    cout << mess << endl;
    return 0;
}
    这个方法的精度能够达到ns级。

抱歉!评论已关闭.