clock函数功能:测试程序时间,测试从程序开始运行到clock被调用所耗费的时间。
头文件:time.h
时间单位:clock_tick,即"时钟打点"
数据类型clock_t
常数CLK_TCK(CLOCKS_PER_SEC):表示机器时钟每秒所走的时钟打点数。
#include<stdio.h>
#include<time.h>
clock_t start , stop;//clock_t是clock()函数返回的变量类型,后续将把返回值赋值给start,stop
//故为了使变量类型一致,需要声明clock_t型变量start,stop
double duration;//记录被测函数运行时间,以秒为单位
int main()
{
//不在测试范围内的准备工作写在clock()调用之前
start = clock(); //开始计时 .返回从main函数开始执行到执行到此的时间
Myfunction();
stop = clock(); //停止计时 .返回从main函数开始执行到执行到此的时间
duration = ((double)(stop-start))/CLK_TCK; //计算运行时间,注意先要将clock_t转换为double类型
CLK_TCK是机器时钟每秒所走的时钟打点数
return 0;
}
//下面我们可以通过一个具体的多项式函数值的计算来比较两种方法的效率。
//f(X)=i*x^i(i:0---9) 计算f(1)
#include<stdio.h>
#include<time.h>
#include<math.h>
clock_t start , stop;//clock_t是clock()函数返回的变量类型
double duration;
#define MAXN 10 //多项式最大项数,多项式阶数+1
#define MAXK 1e7 //被测函数最大重复调用次数
//计算多项式函数值的直接法
double f1(int n, double a[], double x)
{
int i;
double p = a[0];
for(i=1; i<=n; i++)
{
p = 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 = p*x+a[i-1];
}
return p;
}
void run(double(*f)(int, double*, double), double a[], int case_n)
{//此函数用于测试被测函数(*f)的运行时间,并且根据case_n输出相应的结果
//case_n是输出的函数编号,1代表函数1,2代表函数2
int 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%d=%f\n", case_n, double(stop-start));
printf("duration%d=%6.2e\n", case_n,duration);
}
int main()
{
int i;
double a[MAXN];
/*为本题的多项式系数赋值,即a[i]=i*/
for(i=0; i<MAXN; i++)
{
a[i] = double(i);
}
run(f1, a, 1);
run(f2, a, 2);
return 0;
}