代码:
#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 ",ret); printf("ticks%d=%f ",func_n,(double)(end-start)); printf("duration%d=%6.2e ",func_n,duration); }
运行结果:
以上代码巧妙的运用了函数指针来托管方法的调用的开始以及结束,类似于Java中方法的拦截器,在执行前执行后
结论
测试过程中,f1,f2函数分别运行了1e5次方,即10万次
f1运行10万次使用729毫秒
f2运行10万次使用64毫秒
算法f2优于f1,差一个数量级