c++编程语言应用范围广泛,功能强大,我们在上篇文章中就已经对c++的基本概念进行了一个简单的介绍。现在,我们将进一步对C++计时的具体操作进行解读,让大家能从中获得更多的知识。
C++计时操作中所用到的函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:
clock_t clock( void );
这个C++计时的函数返回从“开启这个程序进程”到“程序中调用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,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:
#define CLOCKS_PER_SEC ((clock_t)1000)
可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个C++计时的例子,你可以使用公式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");
- }
在笔者的机器上,C++计时操作后的运行结果如下:
Time to do 10000000 empty loops is 0.03000 seconds
上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使C++计时的精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。
上面介绍了clock函数,下面是我自己编写的贪吃蛇游戏的一部分功能的代码,其中‘*’代表食物的位置,每一秒钟刷新一次,随机产生。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;int main()
{
void sleep(clock_t t);
int a,b,i,j;
char s[][16]={
{'=','=','=','=','=','=','=','=','=','=','=','=','=','=','=','='},
{'=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','='},
{'=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','='},
{'=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','='},
{'=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','='},
{'=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','='},
{'=','=','=','=','=','=','=','=','=','=','=','=','=','=','=','='}
};
while(1)
{
srand(time(0));
a=1+rand()%5;
srand(time(0));
b=1+rand()%13;
for(i=0;i<7;i++)
{
for(j=0;j<16;j++)
{
if(i==a&&j==b)
s[i][j]='*';
cout<<s[i][j];
}
cout<<endl;
}
s[a][b]=' ';
sleep(1500);}
return 0;
}
void sleep( clock_t wait )
{ clock_t goal;
goal = wait + clock();
while( goal > clock());
}有机会以后再给大家展示自己编写的全部简单的贪吃蛇的程序。