我们在写程序时,常常会好奇,到底我们的几个算法那个好呢,这时,当然你可已使用大O技法来分析复杂度,当然,我认为还是使用编程来计算运算时间来的简单,而且,在数据面前,我们可以信服。
在C++的库函数中,已经给我们提供了这样的方法,clock(),我们可以使用它来计算程序的运行时间,闲话少说了,开门见山:
计算程序运行时间使用的知识点:
1clock_t
2clock()
3CLOCKS_PER_SEC
这些库函数、类型和常量都是定义在ctime库中的。下面就解释一下吧!
1clock_t数据类型,其实,当你打开time.h就知道了,就是个long型,用来记录一段时间内的clocks数,即CPU的运行单元时间。
2clocks()函数,返回类型clock_t,返回的是从程序开始,到你掉用clock()函数这段时间的clocks。
3CLOCK_PER_SRC
我们若想计算程序的运行时间,则只要根据程序的入口点和出口点出都计算clocks,再算差就可以了,都是在main()中进行操作,如下:
int main() {
clock_t start, end;
start = clock();
//省略
end = clock();
cout<<"Run time: "<<(double)(end - start) / CLOCKS_PER_SEC<<"S"<<endl;
return 0;
}
这样就ok了,我们来试试吧,都说一般情况下,由于递归的堆栈操作性能不好,不建议使用递归进行数值计算,那么,我们跑跑下面两个程序就知道原因了,它们都是求Fibonachi的。
递归:
#include <iostream>
#include <ctime>
using namespace std;
unsigned int outFibonachi(int i); //其中i表示其中的第几个数
int main() {
clock_t start, end;
start = clock();
for(int j = 1; j <= 30; j++) {
cout<<outFibonachi(j);
if( j % 5 == 0) {
cout<<"/n";
}else {
cout<<" , ";
}
}
end = clock();
cout<<"Run time: "<<(double)(end - start) / CLOCKS_PER_SEC<<endl;
return 0;
}
unsigned int outFibonachi(int i) {
if(i <= 2) {
return 1;
}else {
return outFibonachi(i - 1) + outFibonachi(i - 2);
}
}
非递归:
#include <iostream>
#include <ctime>
using namespace std;
int main() {
clock_t start, end;
start = clock();
int a, b, i;
a = 1;
b = 1;
for(i = 1; i <= 30; i++) {
if(i <= 2) {
cout<<1<<" , ";
}else {
cout<<(a+b);
if(i % 5 == 0)
cout<<"/n";
else
cout<<" , ";
a = b;
b = a + b;
}
}
end = clock();
cout<<"Run time: "<<(double)(end - start) / CLOCKS_PER_SEC<<endl;
return 0;
}
如果,效果不明显,就将计算规模扩大吧,可以套一层循环,哈哈哈