重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
C/C++中的计时函数是clock()。
创新互联公司服务项目包括莱西网站建设、莱西网站制作、莱西网页制作以及莱西网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,莱西网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到莱西省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
所以,可以用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");
}
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);可以返回硬件支持的高精度计数器的频率。先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。
#include "stdafx.h"
#include windows.h
#include time.h
#include "process.h"
#define random(x) (rand()%x)
int _tmain(int argc, _TCHAR* argv[])
{
LARGE_INTEGER fre = { 0 }; //储存本机CPU时钟频率
LARGE_INTEGER startCount = { 0 };
LARGE_INTEGER endCount = { 0 };
QueryPerformanceFrequency(fre);//获取本机cpu频率
//开始计时
QueryPerformanceCounter(startCount);
//运算
for (int i = 0; i 10000000; i++)
{
float fTem1 = random(100)*random(1000)*random(10000)*random(100000);
}
//结束计时
QueryPerformanceCounter(endCount);
//计算时间差
double dTimeTake = ((double)endCount.QuadPart - (double)startCount.QuadPart) / (double)fre.QuadPart;
printf("用时%f\n", dTimeTake);
system("pause");
return 0;
}
CLOCK()函数:
clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:
clock_t
clock(void)
;
这个函数返回从“开启这个程序进程”到“程序中调用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)
可以看到每过千分之一秒(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");
}
在笔者的机器上,运行结果如下:
Time
to
do
10000000
empty
loops
is
0.03000
seconds
上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。
time_t
time(
time_t
*timer
);
返回值是1970年到现在的秒数
用long型接就可以了
参数也是同样意义
如
long
time_s
=
0;
time_s
=
time(
NULL
);
//
time_s就是1970年到现在的秒数
或者
long
*
time_s
=
NULL;
time(time_s);
//
*time_s就是1970年到现在的秒数
要计算前后一段时间的话之前取一次time,之后取一次相减就知道用了多少秒了
获取程序运行时间:
在time.h里有函数clock();本身这个函数取得的时间好像是ms,要取得s就
写成clock()/CLOCKS_PER_SEC;但CLOCKS_PER_SEC是在time.h里定义的,如果没这个定义
那只能用clock();取得ms;这个函数的执行不会中途停止,如果是在windows系统下,因为它是
多任务系统,它需要在各任务之间切换,如果在测试过程中,执行其他程序,所其得的时间,就会
出现差别,还有windows运行速度相当快,对于小型的测试,所得的时间几乎为0,因此最好将
要测试的过程执行100次或以上,然后再将取得的时间执行次数;输出非常耗时间,没什么必要
的话,就不要输出
这是一个测试选择排序的程序
#include
stdio.h
#include
stdlib.h
#include
time.h
#define
M
1000
/*
执行次数
*/
#define
N
500
/*
数组大小
*/
void
SelectSort(int
*a,int
l,int
r)
{
int
i,j,v;
for
(i=0;ir;i++)
{
for
(j=i+1;j=r;j++)
{
if
(*(a+i)*(a+j))
v=*(a+i),*(a+i)=*(a+j),*(a+j)=v;
}
}
}
void
main()
{
int
a[N],i,j;
double
start,finish;
/*
开始时间,结束时间
*/
start=(double)clock();
/*
我的time.h内没有CLOCKS_PER_SEC
*/
for
(j=0;jM;j++)
{
/*
执行M次
*/
for
(i=0;iN;*(a+i++)=rand()%10);
/*
每次重新赋值
*/
SelectSort(a,0,N-1);
}
finish=(double)clock();
printf("%.4fms",(finish-start)/M);
getchar();
}