关于clock()函数计时

     clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的,

           一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。

     clock函数:clock_t clock(); 这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间

           的CPU时钟计时单元 (clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。

     clock_t定义: #ifndef _CLOCK_T_DEFINED
                typedef long clock_t;
                #define _CLOCK_T_DEFINED
                #endif

   #define CLOCKS_PER_SEC ((clock_t)1000):

   可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1

    代码:  

main.c
1 #include <stdio.h>
2 #include <time.h>
3
4 int binsearch(int x, int v[], int n);
5
6 int main()
7 {
8
9 int num[11] = {0,-5,3,63,9,4,7,6,8,5,10};
10 int tag = 8;
11 int res;
12 clock_t start;
13 clock_t finish;
14
15 start = clock();
16 res = binsearch(tag, num, 11);
17 finish = clock();
18 printf("%ld, %ld\n", start, finish);
19 printf("%d\n%f\n", res, (double)(finish - start) / CLOCKS_PER_SEC);
20 //而非(double)((finish - start) / CLOCKS_PER_SEC)
21
22 return 0;
23 }
24
25 int binsearch(int x, int v[], int n) //折半查找
26 {
27 long time = 40000000;
28 int low = 0;
29 int high = n-1;
30 int mid;
31
32 while(time--)
33 ;
34 while(low <= high)
35 {
36 mid = (low + high) / 2;
37 if(x < v[mid])
38 high = mid - 1;
39 else if(x > v[mid])
40 low = mid + 1;
41 else
42 return mid;
43 }
44
45 return -1;
46 }
47
48 /*#include <stdio.h>
49 #include <time.h>
50
51 int main()
52 {
53
54 long i = 10000000;
55 clock_t start;
56 clock_t finish;
57
58 start = clock();
59 while(i--)
60 ;
61 finish = clock();
62 printf("%f\n",(double)(finish - start) / CLOCKS_PER_SEC);
63 //执行完while循环一共花费0.031s,即31个时钟计时单元
64 //每个时钟计时单元执行了322580次循环。
65
66 return 0;
67 }*/

   分析:L20:如果写成(double)((finish - start) / CLOCKS_PER_SEC)这种形式,一般情况下这个值会为0.0000

             因为finish start CLOCKS_PER_SEC均为long型变(常)量,若finish-start < 1000,则

             (finish - start) / CLOCKS_PER_SEC = 0,再将其强制转换为double型数据,得到0.0000。

             如果写成(double)(finish - start) / CLOCKS_PER_SEC,先会将finish - start转换成double型

             数据,然后执行"/"操作,则编译器自动将CLOCKS_PER_SEC提升为double型,故而是两个double数据相除

             能得到正确结果。

        L33:Q:为什么要加上while(i--);?

             A:本机测试到每个时钟计时单元执行了322580次上述循环,如果不加这个循环,则在瞬间就会执行完

                binsearch函数,这样得到的start,finish数值会是一样的,故而(finish - start) = 0,

                这样会得到执行函数binsearch函数所花费的时间为0,显然这是不对的。

posted on 2011-05-08 23:44  将军之盾  阅读(986)  评论(0编辑  收藏  举报