clock() 函数:计算程序段的运行时间
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;
} // 秦九韶递归算法
运行结果:
可见运用递归算法的函数运行速度明显比前者快了一个数量级。