0%

clock

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( )函数必须要包含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;
}

下面是一个具体的例子

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不一定相同

1677666755946

原创技术分享,您的支持将鼓励我继续创作