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的返回值一直是0的原因:
①.、编译器优化,for循环实际根本没执行,直接跳过去了,所以时间为0.
扩展资料:
C语言中clock()函数的程序例1:(TC下运行通过)
#include?stdio.h
#include?time.h
int?main(void)
{
clock_t?start,?end;
start?=?clock();
end?=?clock();
printf("The?time?was:?%f\n",?(double)(end?-?start)?/?CLK_TCK);
return?0;
}
可以用_nop_( )函数来实现微秒级的延时.
_nop_();??//?直接当成一条语句使用,产生一条NOP指令
注:使用该函数时,需要将头文件#includeintrins.h包含进源文件中.
C语言中提供了许多库函数来实现计时功能
下面介绍一些常用的计时函数
① time()
头文件:time.h
函数原型:time_t time(time_t * timer)
用time()函数结合其他函数(如:localtime、gmtime、asctime、ctime)可以获得当前系统时间或是标准时间.
说明:C标准库中的函数,可移植性最好,性能也很稳定,但精度太低,只能精确到秒,对于一般的事件计时还算够用,而对运算时间的计时就明显不够用了.
函数原型:clock_t clock(void);
说明:可以精确到毫秒,适合一般场合的使用.
头文件:Mmsystem.h?引用库: Winmm.lib
函数原型:DWORD timeGetTime(VOID);
说明:该函数的时间精度是五毫秒或更大一些,这取决于机器的性能.可用timeBeginPeriod和timeEndPeriod函数提高timeGetTime函数的精度.如果使用了,连续调用timeGetTime函数,一系列返回值的差异由timeBeginPeriod和timeEndPeriod决定.
头文件:windows.h
函数原型:DWORD WINAPI GetTickCount(void);
功能:返回自设备启动后的毫秒数(不含系统暂停时间).
说明:精确到毫秒.对于一般的实时控制,使用GetTickCount()函数就可以满足精度要求.
函数原型:BOOLQueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);
BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
功能:前者获得的是CPU从开机以来执行的时钟周期数.后者用于获得你的机器一秒钟执行多少次,就是你的时钟周期.
在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间.
说明:这种方法的定时误差不超过1微秒,精度与CPU等机器配置有关,一般认为精度为透微秒级.在Windows平台下进行高精度计时的时候可以考虑这种方法.
Linux C函数.
头文件:sys/time.h
函数原型:int gettimeofday(struct timeval *tv,struct timezone *tz);
说明:其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果(若不使用则传入NULL即可).
timeval的定义为:
struct?timeval?{ ?
long?tv_sec;?//?秒数
long?tv_usec;?//微秒数
可见该函数可用于在linux中获得微秒精度的时间.
说明:使用这种方式计时,精度可达微秒.经验证,在arm+linux的环境下此函数仍可使用.
Windows 内部有一个精度非常高的定时器, 精度在微秒级, 但不同的系统这个定时器的频率不同, 这个频率与硬件和操作系统都可能有关.利用 API 函数 QueryPerformanceFrequency 可以得到这个定时器的频率.利用 API 函数 QueryPerformanceCounter 可以得到定时器的当前值.
//***********
微秒延时函数
********************************************
void
Delayus(unsigned
int
US)
unsigned
i;
for(
i=0;iUS;i++);
//*********************************************************************
如果系统频率不一样,就按比例改变.
在linux里用select可以达到延迟效果,阻塞和非阻塞都可以选择,也可以创建一个线程用ulseep做延迟,时间到了就向目标线程发送信号或者使用变量来通知.用gettimeofday函数可以达到微妙级
以上就是土嘎嘎小编为大家整理的微秒级的计时函数c语言相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!