比较程序的效率
今天老师给了个这样的题:
编写程序,测试两条循环语句的执行时间。分析为何执行时间不同。 int A[ROWS][COLS]; for(row=0; row<ROWS;row++) for(col=0;col<COLS;col++) A[row][col]=0; for(col=0;col<COLS;col++) for(row=0; row<ROWS; row++) A[row][col]=0;
于是就需要在程序中计算某一段执行的时间,找了一下,发现C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。查得clock函数定义如下:
clock_t clock( void );
这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对 它的定义:
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个常量CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:
#define CLOCKS_PER_SEC ((clock_t)1000)
所以我们需要使用clock()算出程序执行期间的tick总数,再除以这个CLOCKS_PER_SEC,所以程序可以这样写:
-
#include<stdio.h>
-
#include<time.h>
-
#include<stdlib.h>
-
#define ROWS 10000
-
#define COLS 10000
-
int a[ROWS][COLS];
-
main()
-
{
-
clock_t start,finish;
-
double elapsed1,elapsed2;
-
int row,col;
-
start=clock();
-
for(row=0;row<ROWS;row++)
-
for(col=0;col<COLS;col++)
-
a[row][col]=0;
-
finish=clock();
-
elapsed1=(double)(finish-start)/CLOCKS_PER_SEC;
-
start=clock();
-
for(col=0;col<COLS;col++)
-
for(row=0;row<ROWS;row++)
-
a[row][col]=0;
-
finish=clock();
-
elapsed2=(double)(finish-start)/CLOCKS_PER_SEC;
-
system("pause");
-
return 0;
-
}
输出:
the first loop cost 1.381000 seconds.
the second loop cost 6.880000 seconds.
这样哪个循环运行更快,一下子就看出来。