当前位置: 代码迷 >> 综合 >> c语言 clock() 计算函数的执行时间
  详细解决方案

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

热度:9   发布时间:2023-10-19 22:06:43.0

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

输出结果:
c语言 clock() 计算函数的执行时间

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

  • 重复执行多次,使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;
}

输出结果:
c语言 clock() 计算函数的执行时间
很显然,时间就比较出来了,秦九韶算法所用时间比普通算法小一个数量级,所以秦九韶算法执行时间更少。解决问题的效率还跟方法有关,跟算法的巧妙程度有关!

  相关解决方案