c++获取时间胎儿数据时间(cc++测试函数的运行时间胎儿数据时间)(胎儿数据时间)
在C++中,获取当前时间应该使用ctime、gettimeofday、chrono等方法。下面将介绍怎样使用这类办法获取当前时间。
first of all,我们来看一下ctime方法。它返回一个预示当前时间的C字符串。使用time函数获取当前时间的秒数,并且将其传递给ctime函数,就能够得到一个带有日期和时间信息的C字符串。
#include
#include<***tream>
intmain(){
std::time_tresult=std::time(nullptr);
std::cout<
return0;
}
接着下面,我们来介绍gettimeofday方法。它真的可以获取当前时间的秒数和微秒数。使用gettimeofday函数将当前时间保存在一个timeval结构体中,并通过访问结构体的成员tv_sec和tv_usec来获取秒数和微秒数。
#include
#include<***tream>
intmain(){
timevaltv;
gettimeofday(&tv,nullptr);
std::cout<
return0;
}
最后,我们来介绍chrono方法。它是C++11引入的一种跨平台的时间处理库。使用chrono命名空间中的类system_clock和time_point,可以轻松地获取当前时间。
#include<***tream>
#include
intmain(){
std::chrono::system_clock::time_pointnow=std::chrono::system_clock::now();
std::time_tnow_c=std::chrono::system_clock::to_time_t(now);
std::cout<
return0;
}
通过以上这类办法,俺们是可以方便地获取当前时间。接着下面,我们将介绍怎样使用C++来测试函数的运行时间。下面是八种常用的方式方法。
(一)使用clock函数来获取函数执行时间。
(二)使用gettimeofday函数和timeval结构体来获取函数执行时间。
(三)使用chrono库中的high_resolution_clock来获取函数执行时间。
(四)使用timespec结构体和clock_gettime函数来获取函数执行时间。
(五)使用QueryPerformanceFrequency函数和QueryPerformanceCounter函数来获取函数执行时间。
(六)使用rdtsc指令来获取函数执行时间。
(七)使用std::chrono::steady_clock和std::chrono::time_point_cast来获取函数执行时间。
(八)使用__rdtscp指令来获取函数执行时间。
通过使用这类办法,俺们是可以简单而准确地测试函数的运行时间,从而优化流程的性能。
来源头条作者:晒晒追剧
目前,存在着各式计时函数,普通的处理都是先调用计时函数,记下当前时间tstart,紧接着处理一段流程,再调用计时函数,记下处理后的时间tend,再tend和tstart做差,就能够得到流程的执行时间,不过各式计时函数的精度不一样。下面对各式计时函数,做些简单记录。voidfoo()
方法1,time()获取目前的系统时间,返回的结果是一个time_t类型,即是一个大整数,其值预示从CUT(CoordinatedUniversalTime)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。voidtest1()
方法2,clock()函数返回从“开启这个流程进程”到“流程中调用clock()函数”时之间的CPU时钟计时单元(clocktick)数,在MSDN中叫作挂钟时间(wal-clock)常量CLOCKS_PER_SEC,它用以预示一秒钟会有几个时钟计时单元。voidtest2()
方法3,timeGetTime()函数以毫秒计的系统时间。该时间为从系统开启算起所经过的时间,是windowsapivoidtest3()
假如你想学校C/C++可以来这个群,first of all是三三零,中间是八五九,最后是七六六,里面有大量的学习资料。
方法4,QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它真的可以以微妙为单位计时。不过QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,务 必要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率。QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数。voidtest4()
方法5,GetTickCount返回(retrieve)从操作系统启动至今所经过(elapsed)的毫秒数,它的返回值是DWORDvoidtest5()
方法6,RDTSC指令,在IntelPentium以上级别的CPU中,有一个称为“时间戳(TimeStamp)”的部件,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。因为当前的CPU主频都非常非常高,所以这个部件可以达到纳秒级的计时精度。这个精确性是上述几种方法所无法比拟的。在Pentium以上的CPU中,提供了一条机器指令RDTSC(ReadTimeStampCounter)来读取这个时刻戳的数字,并且将其保存在EDX:EAX寄存器对中。因为EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,因此我们可以把这条指令视为一个一般的函数调用,由于RDTSC不被C++的内嵌汇编器直接支持,因此我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31inlineunsigned__int64GetCycleCount()
方法7,gettimeofday()linux环境下的计时函数,intgettimeofday(structtimeval*tv,structtimezone*tz),gettimeofday()会把当前的时间有tv所指的结构返回,当地时区的信息则放到tz所指的结构中。//timeval结构定义为:structtimeval{longtv_sec;/*秒*/longtv_usec;/*微秒*/};//timezone结构定义为:structtimezone{inttz_minuteswest;/*和Greenwich时间差了多少分钟*/inttz_dsttime;/*日光节约时间的状态*/};voidtest7()
方法8,linux环境下,用RDTSC指令计时。与方法6是相同的。不过呢在linux实现方式有点差别。#ifdefined(__i386__)static__inline__unsignedlonglongGetCycleCount(void)
汇总,方法1,2,7,8能在linux环境下执行,方法1,2,3,4,5,6能在windows环境下执行。其中,timeGetTime()和GetTickCount()的返回值类型为DWORD,当统计的毫妙数过大时,将会使结果归0,作用与影响统计结果。
测试最终,windows环境下,主频为1、6GHz,单位为秒。
1UseTime:0
2UseTime:0。390000
3UseTime:0。388000
4UseTime:0。394704
5UseTime:0。407000
6UseTime:0。398684