clock() 函数:计算程序段的运行时间

1 minute read

Published:

clock():捕捉从程序开始运行到 clock() 被调用时所耗费的时间。这个时间单位是 clock tick,即“时钟打点”。属于库 time.h

常数 CLK_TCK:机器时钟每秒所走的时钟打点数,一般设备为 100。

调用模板:

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

例:计算多项式

\[f(x) = a_0+a_1x+\cdots+a_{n-1}x^{n-1}+a_nx^n\]

在给定点 \(x\) 处值的算法除了普通循环算法,也可以用秦九韶递归算法。

以下程序比较两个计算给定多项式

\[f(x) = \sum_{i=0}^9 i x^i\]

在给定点 \(x=1.1\) 处的值 \(f(1.1)\) 的函数的运行时间。由于实际上函数运行时间非常快,以至于单次时间难以捕捉。使函数重复运行多次可解决该问题。

#include <stdio.h>
#include <time.h>
#include <math.h>

#define MAXN 10                      // 多项式最大项数,即多项式阶数 + 1
#define MAXK 1e7                     // 被测函数最大重复调用次数
clock_t start, stop;
double duration;

double f1(int n, double a[], double x);
double f2(int n, double a[], double x);

int main() {
    int i;
    double a[MAXN];                 // 存储多项式的系数

    for (i = 0; i < MAXN; i++)
        a[i] = (double)i;

    start = clock();                // 开始计时
    for (i = 0; i < MAXK; i++)      // 重复调用函数以获得充分多的时钟打点数
        f1(MAXN - 1, a, 1.1);
    stop = clock();                 // 结束计算

    duration = ((double)(stop - start)) / CLK_TCK / MAXK;
    printf("ticks1 = %lf\n", (double)(stop - start));
    printf("duration1 = %6.2e\n", duration);

    start = clock();
    for (i = 0; i < MAXK; i++)
        f2(MAXN - 1, a, 1.1);
    stop = clock();

    duration = ((double)(stop - start)) / CLK_TCK / MAXK;
    printf("ticks2 = %lf\n", (double)(stop - start));
    printf("duration2 = %6.2e\n", duration);

    return 0;
}

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;
} // 秦九韶递归算法

运行结果:

time

可见运用递归算法的函数运行速度明显比前者快了一个数量级。