C language clock() calculates the execution time of a function

clock() calculates the execution time of a function

Rationale
clock() : Capture the time from when the program starts running to when clock() is called. This time unit is clock tick, ie “时钟打点”.
Constant CLK_TCK: The number of ticks the machine clock travels per second.

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

Example demonstration

  • This program compares the time of the ordinary polynomial algorithm and Qin Jiushao's algorithm
#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;
}

Output result:
write picture description here

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

  • Repeat the execution multiple times so that clock()the execution time can be captured
#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;
}

Output result:
write picture description here
很显然,时间就比较出来了,秦九韶算法所用时间比普通算法小一个数量级,所以秦九韶算法执行时间更少。解决问题的效率还跟方法有关,跟算法的巧妙程度有关!

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324811288&siteId=291194637