关于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

代码:
关于clock()函数计时关于clock()函数计时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, %ldn", start, finish);19     printf("%dn%fn", 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         else42             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("%fn",(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,显然这是不对的。
原文链接: https://www.cnblogs.com/roma823/archive/2011/05/08/2101257.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/25166

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午3:02
下一篇 2023年2月8日 上午3:02

相关推荐