Crane
Table_bottom

Search
Loading
Table_bottom

分类
Table_bottom

随机文章
Table_bottom

标签云
Table_bottom

最新评论
Table_bottom

链接
Table_bottom

功能
Table_bottom

比较程序的效率

今天老师给了个这样的题:

  1. 编写程序,测试两条循环语句的执行时间。分析为何执行时间不同。
  2.  
  3. int A[ROWS][COLS];
  4. for(row=0; row<ROWS;row++)
  5.     for(col=0;col<COLS;col++)
  6.        A[row][col]=0;
  7. for(col=0;col<COLS;col++)
  8.     for(row=0; row<ROWS; row++)
  9.        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,所以程序可以这样写:

 

  1. #include<stdio.h>
  2. #include<time.h>
  3. #include<stdlib.h>
  4. #define ROWS 10000
  5. #define COLS 10000
  6. int a[ROWS][COLS];
  7. main()
  8. {
  9.         clock_t start,finish;
  10.         double elapsed1,elapsed2;
  11.         int row,col;
  12.         start=clock();
  13.         for(row=0;row<ROWS;row++)
  14.         for(col=0;col<COLS;col++)
  15.         a[row][col]=0;
  16.         finish=clock();
  17.         elapsed1=(double)(finish-start)/CLOCKS_PER_SEC;
  18.         start=clock();
  19.         for(col=0;col<COLS;col++)
  20.         for(row=0;row<ROWS;row++)
  21.         a[row][col]=0;
  22.         finish=clock();
  23.         elapsed2=(double)(finish-start)/CLOCKS_PER_SEC;
  24.         printf("the first loop cost %f seconds.\n",elapsed1);
  25.         printf("the second loop cost %f seconds.\n",elapsed2);
  26.         system("pause");
  27.         return 0;
  28. }

输出:

the first loop cost 1.381000 seconds.
the second loop cost 6.880000 seconds.

这样哪个循环运行更快,一下子就看出来。