clock
C语言中的函数clock( ),它可以捕捉从程序开始运行到clock(` )被调用时所耗费的时间。它计时所用的单位是clock tick,翻译成中文就是“时钟打点”。
与之配套的还有一个常数CLK_TCK,实际上就是“clock tick”的缩写。它给出的是机器时钟每秒所走的时钟打点数。这个数在不同机器中可能不一样,可以通过写程序得到一台机器的CLK_TCK。
代码如下:
#include <stdio.h>
#include<math.h>
#include<time.h>
int main( )
{
printf("%d\n", CLK_TCK);
return 0;
}
将clock( )函数和常数CLK_TCK两个配合在一起,就可以计算出来一个函数到底跑了多少秒钟。
以下是一个常用的模板:
#include<studio.h>
#include<time.h>
/*要用clock( )函数必须要包含time.h*/
clock_t start,stop;/*clock_t是clock( )函数返回的变量类型*/
double duration;/*记录被测函数运行时间,以秒为单位*/
int main( )
{ /*不在测试范围内的准备工作写在clock( )调用之前*/
start=clock();/*开始计时*/
MyFunction();/*把被测函数加在这里*/
stop=clock();/*停止计时*/
duration=((double)(stop-start))/CLK_TCK;/*计算运行时间*/
/*其他不在测试范围的处理写在后面,例如输出duration的值*/
return 0;
}
下面是一个具体的例子
#include<stdio.h>
#include<math.h>
#include<time.h>
clock_t start, stop;
double duration;
#define MAXN 10
double f(int n, double a[], double x);
int main()
{
int i;
double a[MAXN];
for (i = 0; i < MAXN; i++) a[i] = (double)i;
start = clock();
f(MAXN - 1, a, 1.1);
stop = clock();
duration = ((double)(stop - start)) / CLK_TCK;
printf("ticks=%f\n", (double)(stop - start));
printf("duration=%6.2e\n", duration);
return 0;
}
double f(int n, double a[], double x)
{
int i;
double p = a[0];
for (i = 1; i <= n; i++)
p += (a[i] * pow(x,i));
return p;
}
计算结果都是0,是因为这个函数跑的实在是太快了,它的运行时间不到一个tick,所以clock函数铺捉不到它。解决方法就是让被测函数重复运行充分多次,使得测出的总的时钟打点间隔充分长,最后计算被测函数平均每次运行的时间即可。
调整后的代码如下:
#include<stdio.h>
#include<math.h>
#include<time.h>
clock_t start, stop;
double duration;
#define MAXN 10
#define MAXK 1e7/*被测函数最大重复调用次数*/
double f(int n, double a[], double x);
int main()
{
int i;
double a[MAXN];
for (i = 0; i < MAXN; i++) a[i] = (double)i;
start = clock();
for(i=0;i<=MAXK;i++)/*重复调用函数已获得充分多的时钟打点数*/
f(MAXN - 1, a, 1.1);
stop = clock();
duration = ((double)(stop - start)) / CLK_TCK/MAXK;/*计算函数单次运行的时间*/
printf("ticks=%f\n", (double)(stop - start));
printf("duration=%6.2e\n", duration);
return 0;
}
double f(int n, double a[], double x)
{
int i;
double p = a[0];
for (i = 1; i <= n; i++)
p += (a[i] * pow(x,i));
return p;
}
这个数据在不同的电脑上运行出来的结果不同,因为不同机器的CLK_TCK不一定相同
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v4orqPzH-1681216922345)(image/clock/1677666755946.png)]