clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。属于库time.h。
常数CLK_TCK:机器时钟每秒所走的时钟打点数,一般设备为100。
调用模板:
#include<stdio.h>
#include<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;
}
例:计算多项式
在给定点x处值的算法除了普通循环算法,也可以用秦九韶递归算法。
以下程序比较两个计算给定多项式
在给定点x=1.1处的值f(1.1)的函数的运行时间。由于实际上函数运行时间非常快,以至于单次时间难以捕捉。使函数重复运行多次可解决该问题。
#include <stdio.h>
#include <time.h>
#include <math.h>
#define MAXN 10 // 多项式最大项数,即多项式阶数+1
#define MAXK 1e7 // 被测函数最大重复调用次数
clock_t start, stop;
double duration;
double f1(int n, double a[], double x);
double f2(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++) // 重复调用函数以获得充分多的时钟打点数
f1(MAXN - 1, a, 1.1);
stop = clock(); // 结束计算
duration = ((double)(stop - start)) / CLK_TCK / MAXK;
printf("ticks1 = %lf\n", (double)(stop - start));
printf("duration1 = %6.2e\n", duration);
start = clock();
for (i = 0; i < MAXK; i++)
f2(MAXN - 1, a, 1.1);
stop = clock();
duration = ((double)(stop - start)) / CLK_TCK / MAXK;
printf("ticks2 = %lf\n", (double)(stop - start));
printf("duration2 = %6.2e\n", duration);
return 0;
}
double f1(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;
} // 普通循环算法
double f2(int n, double a[], double x){
int i;
double p = a[n];
for (i = n; i > 0; i--)
p = a[i - 1] + x * p;
return p;
} // 秦九韶递归算法
运行结果:
可见运用递归算法的函数运行速度明显比前者快了一个数量级。