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

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

 例:计算多项式

gif.latex?%5Cfn_cm%20f%28x%29%3Da_0&plus;a_1x&plus;%5Ccdots&plus;a_%7Bn-1%7Dx%5E%7Bn-1%7D&plus;a_nx%5En

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

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

gif.latex?%5Cfn_cm%20f%28x%29%3D%5Csum_%7Bi%3D0%7D%5E%7B9%7Dix%5Ei

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

        运行结果:

6d5ec400c9b64e66ad1627aa643a1ad5.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值