请问C语言中clock()函数该怎么用?
发布网友
发布时间:2022-04-23 03:04
我来回答
共13个回答
热心网友
时间:2022-04-19 01:14
clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t。
它的具体功能是返回处理器调用某个进程或函数所花费的时间。函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,其中clock_t是用来保存时间的数据类型。
在time.h文件中,我们可以找到对它的定义:
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
clock_t其实就是long,即长整形。该函数返回值是硬件滴答数,要换算成秒或者毫秒,需要除以CLK_TCK或者 CLK_TCK CLOCKS_PER_SEC。比如,在VC++6.0下,这两个量的值都是1000,这表示硬件滴答1000下是1秒,因此要计算一个进程的时间,用clock()除以1000即可。
clock的返回值一直是0的原因:
1、编译器优化,for循环实际根本没执行,直接跳过去了,所以时间为0。
2、clock计算的是程序占用cpu的时间,如果你的程序执行的动作很少,那么clock算出的时间也很少。
3、建议使用time gettimeofday函数来计时。
扩展资料:
C语言中clock()函数的程序例1:(TC下运行通过)
#include <stdio.h>
#include <time.h>
int main(void)
{
clock_t start, end;
start = clock();
delay(2000);
end = clock();
printf("The time was: %f\n", (double)(end - start) / CLK_TCK);
return 0;
}
说明:CLK_TCK 定义在TC中的time.h中:#define CLK_TCK18.2。
在VC6.0中也有关于CLK_TCK的宏定义,不过其值不再是18.2,而是1000。
实际上在VC6.0中CLK_TCK已完全等同CLOCKS_PER_SEC。
参考资料来源:百度百科-clock()
热心网友
时间:2022-04-19 02:32
C语言函数clock() 功 能:
返回处理器调用某个进程或函数所花费的时间。
用 法: clock_t clock(void);
说明:clock_t其实就是long,即长整形。该函数返回值是硬件滴答数,要换算成秒或者毫秒,需要除以CLK_TCK或者 CLK_TCK
CLOCKS_PER_SEC。比如,在VC++6.0下,这两个量的值都是1000,这表示硬件滴答1000下是1秒,因此要计算一个进程的时间,用clock()除以1000即可。具体见第一个例子。
程序例1:(TC下运行通过)
#include <stdio.h>
#include <time.h>
int main(void)
{
clock_t start, end;
start = clock();
delay(2000);
end = clock();
printf("The time was: %f\n", (double)(end - start) / CLK_TCK);
return 0;
}
CLK_TCK 定义在TC中的time.h中:#define CLK_TCK
18.2。在VC6.0中也有关于CLK_TCK的宏定义,不过其值不再是18.2,而是1000。实际上在VC6.0中CLK_TCK已完全等同于CLOCKS_PER_SEC。
在VC中delay用Sleep()来代替,其头文件是windows.h。
程序例2:(VC6.0下运行通过)
#include <stdio.h>
#include <time.h>
#include<windows.h>
int main(void)
{
clock_t start, end;
start = clock();
Sleep(2000);
end = clock();
printf("The time was: %d\n", (end - start) /
CLK_TCK);//注意是%d,不再是%f
return 0;
}
程序例3:(VC6.0下运行通过)
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int main( void )
{
long i = 10000000L;
clock_t start, finish;
double ration;
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- ) ;
finish = clock();
ration = (double)(finish - start) / CLK_TCK;
//CLK_TCK在VC6.0中可以用CLOCKS_PER_SEC
printf( "%f seconds\n", ration );
system("pause");
return 0;
}
热心网友
时间:2022-04-19 04:06
The clock() function returns an approximation of processor time used by the program.
以上内容摘自 man 3 clock
返回接近程序使用的CPU时间 你拿这个做种子?
如果linux下 建议
GRand* g_rand_new (void);
Creates a new random number generator initialized with a seed taken either from /dev/urandom (if existing) or from the current time (as a fallback).
使用这个函数 直接使用操作系统提供的/dev/urandom 这个设备是根据环境噪声产生的真(记得好像是)随机数
如果没有urandom就使用当前时间 具体这个时间精确到多少不知道
如果不用glib库
就直接去读/dev/urandom设备 这个做种子是最好了的
linux里面一般都用这个/dev/random 和/dev/urandom得到真随机数 这个这个设备的种子是 通过中断事件得到的 网卡 键盘 等设备的中断是异步 产生的随机数应该可以算作真随机数了
不过这个只适应linux而且 程序环境必须是在有交换性 也就是外界必须提供中断事件 而且如果熵池里面的随机数用完了 读取这个设备会造成程序阻塞 直到熵池里有新的随机数
如果你的程序适应这种条件
可以使用glib 有交换环境 linux (一般不是特殊环境下都满足)
建议直接使用这个方便的函数了
glib就是为了方便程序员 跨平台跑程序的 在window下可以用
clock()函数没什么好说的我直接把man里面note节翻译给你看下
Note that the time can wrap around. On a 32-bit system where CLOCKS_PER_SEC equals 1000000 this function will return the same value approximately every 72 minutes.
每72分钟会产生相同的值 (所以肯定是伪随机数,不过可以达到一般程序要求了)
On several other implementations, the value returned by clock() also includes the times of any children whose status has been collected via wait(2) (or another wait-type call). Linux does not include the times of waited-for children in the value returned by clock(). The times(2) function, which explicitly returns (separate) information about the caller and its children, may be preferable.
The C standard allows for arbitrary values at the start of the program; subtract the value returned from a call to clock() at the start of the program to get maximum portability.
C标准允许在程序开始设置一个任意值减去"clock()"的返回值 作为结果
以方便移植
The value returned is the CPU time used so far as a clock_t; to get the
number of seconds used, divide by CLOCKS_PER_SEC. If the processor
time used is not available or its value cannot be represented, the
function returns the value (clock_t) -1.
函数的返回值 使用的秒数除以CLOCKS_PER_SEC (32位系统这个数是1000000)
如果time不可用 返回(clock_t) -1
linux里面不会收集子进程的CPU使用时间
但某些其他实现收集子进程CPU使用时间
热心网友
时间:2022-04-19 05:58
clock 计算的是从程序运行到执行clock时的时间间隔。
重复启动程序,时间还是 从程序运行到执行clock时的时间间隔。
这个数字不变,种子不变。你的随机就不随机了。
所以要用:
srand(time(NULL));
time(NULL) 是永远在变的。种子变,随机了。
热心网友
时间:2022-04-19 08:06
网上资料错了,clock返回当前进程创建到现在经过的时钟周期数
你的程序那么短,返回0是正常的
我在自己的电脑上试了试,在调用clock()前用了Sleep(1000),结果就不一样了
Sleep()是 Windows API,不要在你的程序里用
而且觉得,随机数钟子只要设一次就够了,不应该每次设,
你这样,在一段时间内(大约1毫秒)都会得到同样的随机数
clock返回的大约是毫秒级(不是处理器周期,你可以查CLOCKS_PER_SEC)
热心网友
时间:2022-04-19 10:30
clock()函数返回开启进程和调用clock()之间的的CPU时钟计时单元(clock tick)数,每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。因此该函数只能精确到1ms,低于1ms的程序全部返回0。
你写的这个程序过于简短,运行时间太短,因此输出的结果都是一样的。设法设置延时试试。
热心网友
时间:2022-04-19 13:12
clock返回当前进程创建到现在经过的时钟周期数
由于你每次都重新执行程序,而且上来就调用clock函数,所以返回0是正常的。
如果你能够sleep一下,clock返回值就会不同的。
另外,别拿clock返回值做种子,建议使用系统时间,如秒数、毫秒数。
热心网友
时间:2022-04-19 16:10
clock_t clock( void );函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数。由于C只能精确到毫秒级,时间太短了不足1毫秒,所以记为0,还是用time函数吧。
热心网友
时间:2022-04-19 19:24
如果你是用在32位嵌入式系统中(如ARM),而且有操作系统(如Linux),那是可以用clock的.
如果没有操作系统, GNU gcc 是可以编译通过的,但运行时会跳到 DataAbort.
gettimeofday() , clock_gettime() 之类的是有操作系统内核提供支持,所以你才能用到这些API,不一定是linux ,其它OS也会有.
总之,没有OS情况下要自己写代吗.
热心网友
时间:2022-04-19 22:56
/*CLOCK.C:
等待3秒,记录程序运行开始时间(start里)
循环600000次做运算
[a=sqrt(sqrt(16.0));a=sqrt(sqrt(16.0));]
记录程序运算结属时间(finish里)
算出这六十万次运行时间.
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
voidsleep(clock_twait);
voidmain(void)
{
longi=600000L;
clock_tstart,finish;
doubleration;
doublea;
/*等三秒*/
printf("Delayfor3seconds\n");
sleep((clock_t)3*CLOCKS_PER_SEC);
printf("Done!\n");
/*Measuretherationofanevent.*/
printf("Timetodo%ldloopsis",i);
start=clock();
while(i--){
a=sqrt(sqrt(16.0));a=sqrt(sqrt(16.0));
}
finish=clock();
ration=(double)(finish-start)/CLOCKS_PER_SEC;
printf("%lfseconds\n",ration);
}
/*等待多少毫秒的子程序*/
voidsleep(clock_twait)
{
clock_tgoal;
goal=wait+clock();
while(goal>clock())
;
}
热心网友
时间:2022-04-20 02:44
time的精度达不到?你的意思是不是嫌它跑得不够快。
那你可以将它的结果乘以一些数。
TC与gcc它们的时间函数差别很多。主要还是tc下拿不到毫秒,微秒级的时间。
热心网友
时间:2022-04-20 06:48
在32位编译器里运行过了 clock() 返回值 并不是 0
热心网友
时间:2022-04-20 11:10
哭啊。。学完C语言咋没见过这个。。