代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> clock_t start, end; /*clock_t 是clock()函数返回的变量类型*/ double duration; /*被测函数运行时间,以秒为单位*/ #define MAXN 101 /* 多项式最大项数,即多项式次数+1 */ #define MAXK 1e5 /* 被测函数最大重复调用次数 */ double f1(int n, double a[], double x); double f2(int n, double a[], double x); void run(double(*f)(int, double *, double), double a[], int func_n); int main(int argc, char const *argv[]) { int i; double a[MAXN]; /* 存储多项式系数 */ a[0] = 1; for (i = 1; i < MAXN; ++i) { a[i] = (double)(1.0/i); } run(f1, a, 1); run(f2, a, 2); 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; } void run(double(*f)(int, double *, double), double a[], int func_n) { int i; double ret; start = clock(); for (i = 0; i < MAXK; ++i) { ret = f(MAXN - 1, a, 1.1); } end = clock(); /* 常数CLK_TCK:机器时钟每秒所走的时钟打点数 */ duration = ((double)(end - start)) /CLK_TCK; printf("result:%lf\n",ret); printf("ticks%d=%f\n",func_n,(double)(end-start)); printf("duration%d=%6.2e\n",func_n,duration); }
运行结果:
以上代码巧妙的运用了函数指针来托管方法的调用的开始以及结束,类似于Java中方法的拦截器,在执行前执行后
结论
测试过程中,f1,f2函数分别运行了1e5次方,即10万次
f1运行10万次使用729毫秒
f2运行10万次使用64毫秒
算法f2优于f1,差一个数量级
本博客文章绝大多数为原创,少量为转载,代码经过测试验证,如果有疑问直接留言或者私信我。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。
创作文章不容易,转载文章必须注明文章出处;如果这篇文章对您有帮助,点击右侧打赏,支持一下吧。