C/C++ 各种计时函数总结

本文对Windows平台下常用的计时函数进行总结,包括精度为秒、毫秒、微秒三种精度的5 种方法。分为在标准C/C++下的二种time()及clock(),标准C/C++所以使用的time()及clock()不仅可以用在Windows 系统,也可以用于Linux系统。在Windows系统下三种,使用Windows提供的API接口timeGetTime()、 GetTickCount()及QueryPerformanceCounter()来完成。文章最后给出了5种计时方法示例代码。

 

标准C/C++的二个计时函数time()及clock()

 

time_t time(time_t *timer);

返回以格林尼治时间(GMT)为标准,从1970年1月1日00:00:00到现在的此时此刻所经过的秒数。

time_t实际是个long长整型typedef long time_t;

头文件:#include <time.h>

 

clock_t clock(void);

返回进程启动到调用函数时所经过的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock),以毫秒为单位。

clock_t实际是个long长整型typedef long clock_t;

头文件:#include <time.h>

 

 

Windows系统API函数

timeGetTime()、GetTickCount()及QueryPerformanceCounter()

 

DWORD timeGetTime(VOID);

返回系统时间,以毫秒为单位。系统时间是从系统启动到调用函数时所经过的毫秒数。注意,这个值是32位的,会在0到2^32之间循环,约49.71天。

头文件:#include <Mmsystem.h>            

引用库:#pragma comment(lib, "Winmm.lib")  

 

DWORD WINAPI GetTickCount(void);

这个函数和timeGetTime()一样也是返回系统时间,以毫秒为单位。

头文件:直接使用#include <windows.h>就可以了。

 

高精度计时,以微秒为单位(1毫秒=1000微秒)。

先看二个函数的定义

BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount);

得到高精度计时器的值(如果存在这样的计时器)。

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

返回硬件支持的高精度计数器的频率(次每秒),返回0表示失败。

再看看LARGE_INTEGER

它其实是一个联合体,可以得到__int64 QuadPart;也可以分别得到低32位DWORD LowPart和高32位的值LONG HighPart。

在使用时,先使用QueryPerformanceFrequency()得到计数器的频率,再计算二次调用QueryPerformanceCounter()所得的计时器值之差,用差去除以频率就得到精确的计时了。

头文件:直接使用#include <windows.h>就可以了。

 

 

下面给出示例代码,可以在你电脑上测试下。

//Windows系统下time(),clock(),timeGetTime(),GetTickCount(),QueryPerformanceCounter()来计时 by MoreWindows  
#include <stdio.h>  
#include <windows.h>  
#include <time.h> //time_t time()  clock_t clock()  
#include <Mmsystem.h>             //timeGetTime()  
#pragma comment(lib, "Winmm.lib")   //timeGetTime()  
  
int main()  
{  
    //用time()来计时  秒  
    time_t timeBegin, timeEnd;  
    timeBegin = time(NULL);  
    Sleep(1000);  
    timeEnd = time(NULL);  
    printf("%d\n", timeEnd - timeBegin);  
      
      
    //用clock()来计时  毫秒  
    clock_t  clockBegin, clockEnd;  
    clockBegin = clock();  
    Sleep(800);  
    clockEnd = clock();  
    printf("%d\n", clockEnd - clockBegin);  
      
      
    //用timeGetTime()来计时  毫秒  
    DWORD  dwBegin, dwEnd;  
    dwBegin = timeGetTime();  
    Sleep(800);  
    dwEnd = timeGetTime();  
    printf("%d\n", dwEnd - dwBegin);  
      
      
    //用GetTickCount()来计时  毫秒  
    DWORD  dwGTCBegin, dwGTCEnd;  
    dwGTCBegin = GetTickCount();  
    Sleep(800);  
    dwGTCEnd = GetTickCount();  
    printf("%d\n", dwGTCEnd - dwGTCBegin);  
      
      
    //用QueryPerformanceCounter()来计时  微秒  
    LARGE_INTEGER  large_interger;  
    double dff;  
    __int64  c1, c2;  
    QueryPerformanceFrequency(&large_interger);  
    dff = large_interger.QuadPart;  
    QueryPerformanceCounter(&large_interger);  
    c1 = large_interger.QuadPart;  
    Sleep(800);  
    QueryPerformanceCounter(&large_interger);  
    c2 = large_interger.QuadPart;  
    printf("本机高精度计时器频率%lf\n", dff);  
    printf("第一次计时器值%I64d 第二次计时器值%I64d 计时器差%I64d\n", c1, c2, c2 - c1);  
    printf("计时%lf毫秒\n", (c2 - c1) * 1000 / dff);  
      
    printf("By MoreWindows\n");  
    return 0;  
} 



下面是本人电脑上的测试结果:

 

 

 

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/6854764

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FlexRay是一种实时通信协议,它是一种高性能、可靠、安全、灵活、高带宽的总线系统。它可以同步传输高速或低速数据,支持多种拓扑结构,包括星型、树型或环型结构,并具有灵活的带宽分配能力,以便在多个数据包同时发送的情况下,实现高效的带宽利用。 FlexRay被广泛应用于汽车领域,特别是高端汽车和电动汽车市场,在不同的汽车子系统中(如发动机、变速器、车身控制等)进行实时通信和控制。FlexRay能够满足高可靠性、高带宽、高灵活性和高安全性的需求,可以应对车辆的不同控制需求和复杂的电子系统架构。 FlexRay还有许多独特的设计特点,如网络同步、动态带宽分配、双通道数据传输、主备冗余和ECC等,这些特点使得FlexRay能够提供高度的安全性和可靠性,同时具有快速响应和更好的通信效率等优点。 总之,FlexRay是一种多功能、高效、可靠和安全的通信协议,特别适合应用于汽车领域,可以提高汽车系统的性能和安全性,为各种智能化和电动化的发展提供必要的技术支持。 ### 回答2: FlexRay是一种实时通信总线协议,旨在提高汽车电子系统的性能和可靠性。FlexRay被广泛应用于高端汽车电子系统,包括车身电子控制单元、安全系统、发动机控制单元等。该协议采用了高速串行通信的方式,支持高达10 Mbit/s的数据传输速率,并具有卓越的实时性和可靠性。 FlexRay采用了冗余设计,包括双通道、双线宽、冗余节点和双刹车信号等,以确保系统的可靠性和鲁棒性。此外,FlexRay还支持周期传输、事件触发、带宽保障和优先级抢占等特性,以满足不同应用场景下的实时通信要求。 FlexRay的优点包括高数据传输速率、高实时性和可靠性、灵活的数据传输方式、可兼容CAN等其他总线协议、支持广泛的应用场景等。不过,FlexRay的缺点包括设计和实现的复杂度高、成本较高、兼容性不够好等。 总的来说,FlexRay是一种先进的汽车电子系统通信协议,其特性和优势适用于高端汽车和需要高性能、可靠性和实时性的应用场景。 ### 回答3: FlexRay是一种高速数据通信总线标准,旨在满足至关重要的应用程序的通信需求。 FlexRay主要用于汽车电子设备系统,如控制发动机、ABS和车辆稳定性控制等关键应用程序。 FlexRay的最大优点是速度,其数据传输速度最高为10 Mbit/s,这足以满足时间敏感的应用程序的需求,同时它还具有高可靠性和实时性。 FlexRay基于时间分割多路访问(TDMA)多主机体系结构。每个节点都有一个精确的时间参考,以确保所有节点在预定义的时间间隔内发送数据。该技术具有高度的灵活性,使得节点可以按照需求动态重新配置,同时也能够容忍节点中断和崩溃,从而提供了更高的可靠性和安全性。 在汽车电子控制设备应用领域,FlexRay能够有效地支持处理大量数据,并确保实时性和可靠性,从而为车辆操作提供更安全和更可靠的控制。除了应用于汽车电子系统之外,还有一些其他领域也在使用FlexRay,例如军工和工业领域。 总之,FlexRay是一种高速、高可靠性、实时性强的总线标准,适用于需要高速、可靠、实时传输大量数据的关键应用程序。它为汽车电子设备系统提供了更高的性能和安全性,也将成为其他领域的新兴技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值