clock
C语言中的函数clock( ),它可以捕捉从程序开始运行到clock( )被调用时所耗费的时间。它计时所用的单位是clock tick,翻译成中文就是“时钟打点”。
与之配套的还有一个常数CLK_TCK,实际上就是“clock tick”的缩写。它给出的是机器时钟每秒所走的时钟打点数。这个数在不同机器中可能不一样,可以通过写程序得到一台机器的CLK_TCK。
代码如下:
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> #include<math.h> #include<time.h>
int main( ) { printf("%d\n", CLK_TCK); return 0; }
|
将clock( )函数和常数CLK_TCK两个配合在一起,就可以计算出来一个函数到底跑了多少秒钟。
以下是一个常用的模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include<studio.h> #include<time.h>
clock_t start,stop; double duration; int main( ) { start=clock(); MyFunction(); stop=clock(); duration=((double)(stop-start))/CLK_TCK; return 0; }
|
下面是一个具体的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #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函数铺捉不到它。解决方法就是让被测函数重复运行充分多次,使得测出的总的时钟打点间隔充分长,最后计算被测函数平均每次运行的时间即可。
调整后的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #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不一定相同