c语言 clock() 计算函数的执行时间

clock() 计算函数的执行时间

原理
clock(): 捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”
常数CLK_TCK:机器时钟每秒所走的时钟打点数。

#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;
}

实例演示

  • 这个程序是比较多项式的普通算法和秦九韶算法的时间的
#include<stdio.h>
#include <time.h>
#include <math.h>
#define MAXN 10     /* 多项式最大项数,即多项式阶数 + 1 */

clock_t start, stop;
double duration;
double testFunc(double a[], int m);
double f1(int n, double a[], double x);
double f2(int n, double a[], double x);

int main(void)
{
    int i;
    double a[MAXN];     /*存储多项式的系数*/
    for (i = 0; i < MAXN; i++) a[i] = (double)i;

    for (i = 0; i < 2; i++)
        testFunc(a, i);

    return 0;
}

double testFunc(double a[], int m)
{
    start = clock();
    m == 0 ? f1(MAXN - 1, a, 1.1) : f2(MAXN - 1, a, 1.1);
    stop = clock();
    duration = (double)(stop - start) / CLK_TCK;
    printf("ticks%d = %f\n", m, (double)(stop - start));
    printf("duration = %6.2e\n", duration);
}

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;
}

输出结果:
这里写图片描述

上面的函数的执行时间太少了,以至于无法区分,下面通过增加执行次数来获取时间

  • 重复执行多次,使clock()可以捕捉到执行的时间
#include<stdio.h>
#include <time.h>
#include <math.h>
#define MAXN 10
#define MAXK 1e7    /* 被测函数最大重复调用次数 */

clock_t start, stop;
double duration;
double testFunc(double a[], int m);
double f1(int n, double a[], double x);
double f2(int n, double a[], double x);

int main(void)
{
    int i;
    double a[MAXN];
    for (i = 0; i < MAXN; i++) a[i] = (double)i;

    for (i = 0; i < 2; i++)
        testFunc(a, i);

    return 0;
}

double testFunc(double a[], int m)
{
    start = clock();
    if (m == 0)
    {
        for (int i = 0; i < MAXK; i++)
            f1(MAXN - 1, a, 1.1);
    }
    else
    {
        for (int i = 0; i < MAXK; i++)
            f2(MAXN - 1, a, 1.1);
    }
    stop = clock();
    duration = (double)(stop - start) / CLK_TCK / MAXK; /* 计算函数单次运行的时间 */
    printf("ticks%d = %f\n", m, (double)(stop - start));
    printf("duration = %6.2e\n", duration);
}

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;
}

输出结果:
这里写图片描述
很显然,时间就比较出来了,秦九韶算法所用时间比普通算法小一个数量级,所以秦九韶算法执行时间更少。解决问题的效率还跟方法有关,跟算法的巧妙程度有关!

猜你喜欢

转载自blog.csdn.net/qq_34907362/article/details/80067522