计算 函数的执行时间 的函数 clock()及其相关

基本概念介绍:
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);

函数指针作为参数,并在函数中正确使用(再看一遍代码)

发布了92 篇原创文章 · 获赞 35 · 访问量 6375

猜你喜欢

转载自blog.csdn.net/CourserLi/article/details/103593034
今日推荐