clock()


编辑




CLOCK计时函数


clock()是C/C++中的计时函数,而与其相关的 数据类型是clock_t。在MSDN中,查得对clock函数定义如下:



clock_t clock(void) ;


简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的 数据类型,在time.h文件中,我们可以找到对它的定义:



#ifndef _CLOCK_T_DEFINED 
 
 
 

   typedef long clock_t; 
 
 
 

   #define _CLOCK_T_DEFINED 
 
 
 

   #endif



很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个 常量 CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:



#define CLOCKS_PER_SEC ((clock_t)1000)

在linux系统下,CLOCKS_PER_SEC的值可能有所不同,目前使用的linux打印出来的值是1000000,表示的是微妙。这一点需要注意。



可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:



void elapsed_time() 
 
 
 

   { 
 
 
 

   printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC); 
 
 
 

   }



当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:


#include <stdio.h> 
 
 
 

   #include < 
  stdlib.h> 
 
 
 

   #include <time.h> 
 
 
 

   int main(void) 
 
 
 

   { 
 
 
 

   long i = 10000000L; 
 
 
 

   clock_t start, finish; 
 
 
 

   double duration; 
 
 
 

   /* 测量一个事件持续的时间*/ 
 
 
 

   printf( "Time to do %ld empty loops is ", i) ; 
 
 
 

   start = clock(); 
 
 
 

   while( i-- ); 
 
 
 

   finish = clock(); 
 
 
 

   duration = (double)(finish - start) / CLOCKS_PER_SEC; 
 
 
 

   printf( "%f seconds\n", duration ); 
 
 
 

   system("pause"); 
 
 
 

   return 0; 
 
 
 

   }


在笔者的机器上,运行结果如下:



Time to do 10000000 empty loops is 0.03000 seconds


上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。



C++获取当前时间和计算程序运行时间的方法



 



获取当前时间:



 



#include<iostream> 
 #include<Windows.h>
  
 using namespace std; 
   
 int main() 
 {  
   SYSTEMTIME sys; 
   GetLocalTime(&sys); 
   cout<<sys.wYear<<"年"; 
   cout<<sys.wMonth<<"月"; 
   cout<<sys.wDay<<"日"; 
   cout<<sys.wHour<<"时"; 
   cout<<sys.wMinute<<"分"; 
   cout<<sys.wSecond<<"秒"; 
   cout<<sys.wMilliseconds<<"毫秒";  
   cout<<",星期"<<sys.wDayOfWeek<<endl; 
   
  system("pause"); 
  return 0; 
 }

 



计算程序运行时间 方法一


#include<iostream>
 #include<time.h>//关键using namespace std; 
   
 int main() 
 {  
   clock_t start, finish; 
   double totalTime; 
   start = clock();  
   
   //需要测试运行时间的代码段放在这
   
   
   finish = clock(); 
   totalTime = (double)(finish - start); 
  
   cout<<"花费"<<totalTime<<"毫秒"<<endl; 
   
   system("pause"); 
   return 0; 
 }


 


计算程序运行时间 方法二


#include<iostream>
 #include<Windows.h>//关键
  
 using namespace std; 
   
 int main() 
 {  
   LONGLONG start, finish; 
    //long long  start, finish;这样是可行的 
   LONGLONG totalTime; 
   start = GetTickCount(); 
   
    //需要测试运行时间的代码段放在这
  
   finish = GetTickCount(); 
   totalTime = finish - start;  
   cout<<"花费"<<totalTime<<"毫秒"<<endl; 
   
   system("pause"); 
   return 0; 
 }

http://wenku.baidu.com/view/a1a68fd0195f312b3169a5c4.html

 

 

QueryPerformanceFrequency() - 基本介绍


类型:Win32API

原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

作用:返回硬件支持的高精度计数器的频率。

返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。


QueryPerformanceFrequency() - 技术特点

供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。

函数的原形是:
 

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
   BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
 

typeef union _ LARGE_INTEGER
   {
    struct
    {
    DWORD LowPart;
    LONG HighPart;
    };
    LONGLONG QuadPart;
   } LARGE_INTEGER;

在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。测试函数SLEEP(100)的精确持续时间方法:
 

LARGE_INTEGER litmp;
   LONGLONG qt1,qt2;
   double dft,dff,dfm;
   QueryPerformanceFrequency(&litmp);//获得时钟频率
   dff=(double)litmp.QuadPart;
   QueryPerformanceCounter(&litmp);//获得初始值
   qt1=litmp.QuadPart;Sleep(100);
   QueryPerformanceCounter(&litmp);//获得终止值
   qt2=litmp.QuadPart;
   dfm=(double)(qt2-qt1);
   dft=dfm/dff;//获得对应的时间值

需要注意的是DFT计算的结果单位是秒。

 

#include <windows.h>
 #include <ctime>
 #include <iostream>
 using namespace std;extern void test_microseconds() 
 {LARGE_INTEGER litmp;
  LONGLONG qt1, qt2;
  double dft, dff, dfm;
  clock_t st, et;
  QueryPerformanceFrequency(&litmp);//获得时钟频率
  dff = (double) litmp.QuadPart;
  
 // while (1) 
    {QueryPerformanceCounter(&litmp);//获得初始值
     qt1 = litmp.QuadPart;
     st = clock();
     Sleep(100);
     QueryPerformanceCounter(&litmp);//获得终止值
     qt2 = litmp.QuadPart;
     et = clock();
     
     dfm = (double) (qt2 - qt1);
     dft = dfm / dff;//获得对应的时间值,单位秒
     cout << dfm << " / " << dff << " = " << dft * 1000 << " 毫秒" << endl;
     cout << (et - st) << " 毫秒" << endl;
     }
 } int main(int argc, char* argv[])
 {
 test_microseconds();
 system("pause"); 
     return 0;


} 加入了毫秒级的clock()进行对比可看出的确精确到了微妙级!

 

http://zhidao.baidu.com/question/166046065