基本概念介绍:
clock(): 捕捉从程序开始运行到clock()被调用时所耗费的时间,这个时间单位是clock tick,即"时钟打点"
clock_t:用于存储clock()所赋值变量的类型
CLK_TCK:机器时钟每秒所走的时钟打点数
补充:上述均包含于头文件< time.h >中
具体模板(用法)如下:
举例说明:
我们这里用 普通算法 和 秦九韶算法 来比较它们各自的执行时间
普通算法
秦九韶算法(提取x因子,并从内往外算)
#include<stdio.h>
#include<math.h>
#include<time.h>
#define MAXK 1e7/* 重复运行次数*/
typedef double (*p)(int,double[],double);
clock_t start, stop;
double duration;
double f1(int n, double a[], double x);
double f2(int n, double a[], double x);
double calculateTime(p f, int n, double a[], double x);
int main()
{
double a[101];
a[0] = 1;
for (int i = 1; i <= 100;i++){
a[i] = (double)1/i;
}
calculateTime(f1,100,a,1.1);
calculateTime(f2,100,a,1.1);
}
//计算时间
double calculateTime(p f,int n, double a[], double x)
{
double result;
start = clock();/*开始计时*/
for (int i = 0; i < MAXK;i++)/*重复运行*/
result = f(9, a, x);
stop = clock();/* 结束计时 */
duration = ((double)(stop - start)) / CLK_TCK/MAXK;/* 程序运行一次时间 */
printf("result is %lf,use %2.3e seconds\n",result,duration);
return result;
}
//普通算法
double f1(int n, double a[], double x)
{
double p=0;
for(int i=0;i<=n;i++){
p+=pow(x,i)*a[i];
}
return p;
}
//秦九韶算法
double f2(int n, double a[], double x)
{
double p = a[n];
for(int i=n-1;i>=0;i--){
p = x * p + a[i];
}
return p;
}
重复运行的目的是:运行一次速度太快,未达到clock()的第一个时钟打点,故运行多次,再除以次数,取单此运行秒数的平均值
为函数指针取别名
typedef double (*p)(int,double[],double); p f;
相当于
typedef double (*f)(int,double[],double);
函数指针作为参数,并在函数中正确使用(再看一遍代码)