1 知识内容
第二种方法效率更高。
发现全是0的错误,这是因为函数跑的太快都不到一个tick,clock函数根本捕捉不到区别
2实践
2.1 #define
1.简单的define定义
#define MAXTIME 1000
一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写
if(i<MAXTIME){…}
编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。
这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简单的文本替换,而不是作为一个量来使用,这个问题在下面反映的尤为突出。
2.define的“函数定义”
define可以像函数那样接受一些参数,如下
#define max(x,y) (x)>(y)?(x):(y);
这个定义就将返回两个数中较大的那个,看到了吗?因为这个“函数”没有类型检查,就好像一个函数模板似的,当然,它绝对没有模板那么安全就是了。可以作为一个简单的模板来使用而已。
但是这样做的话存在隐患,例子如下:
#define Add(a,b) a+b;
在一般使用的时候是没有问题的,但是如果遇到如:c * Add(a,b) * d的时候就会出现问题,代数式的本意是a+b然后去和c,d相乘,但是因为使用了define(它只是一个简单的替换),所以式子实际上变成了
ca + bd
另外举一个例子:
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这是应该使用typedef来代替define,这样a和b就都是int型指针了。
所以我们在定义的时候,养成一个良好的习惯,建议所有的层次都要加括号。
2.2代码
测试了一下机器时钟每秒走1000下
#include "pch.h"
#include <iostream>
#include<time.h>
#include<math.h>
#define MAXN 10
clock_t start ,stop;
double f1(int n, double a[], double x);
double f2(int n, double a[], double x);
int main()
{
double a[MAXN];
int i;
for (i = 0; i < MAXN; i++) {
a[i] = (double)i;
};
start = clock();
for (i = 0; i < 1e7; i++) {
f1(MAXN - 1, a, 1.1);
};
stop = clock();
std::cout <<(double)(stop-start)<<"\n";
std::cout << ((double)(stop - start) / CLK_TCK)<<"\n";
printf("%d\n", CLK_TCK);
start = clock();
for (i = 0; i < 1e7; i++) {
f2(MAXN - 1, a, 1.1);
};
stop = clock();
std::cout <<(double) (stop - start) << "\n";
std::cout << (double)((double)(stop - start)/CLK_TCK) << "\n";
printf("%d\n", CLK_TCK);
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;
}
还测试了下自己电脑的CLK_tck为1000,并计算了下自己的时间
上数中第一个为机械时针击打次数,第二个为时间第三个为CLK_TCK。约为10倍关系。