注意:GetTickCount()精确度有限,跟CPU有关,一般精确度在16ms左右,最精确也不会精确过10ms,这就是说如果你的时间间隔在16ms以内的话,两个时间相减为0,如果大于16ms且小于32ms的话,两个时间相减为16ms(也不完全严格,有的时候会是15或者17,根据当时CPU的处理情况而定)。其实也就是说你得到的这个差是实际时间间隔除以16(具体是几取决于你机器的处理能力,但是不会小于10),把余数舍弃。
printf("%d",(end.QuadPart-start.QuadPart)*1000000/Freq.QuadPart);
注意:1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(纳秒)=10^12ps(皮秒)=10^15fs(飞秒)=10^18as(阿秒)=10^21zm(仄秒)=10^24ym(幺秒)
#include <stdio.h> #include<windows.h> int main() { LARGE_INTEGER Freq; //64位有符号整数值. LARGE_INTEGER start; LARGE_INTEGER end; QueryPerformanceFrequency(&Freq); // 获取时钟周期 “1次/秒”,记做Hz(赫兹)。1Hz就是每秒一次 QueryPerformanceCounter(&start); // 获取时钟计数 Sleep(1000);//毫秒为单位 QueryPerformanceCounter(&end); /*此处*1000,以毫秒为单位;*1000000 以微秒为单位*/ /*由于执行时间极短(可能是几微秒),所以采用微秒为单位*/ /* 1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(纳秒) */ printf("%d",(end.QuadPart-start.QuadPart)*1000/Freq.QuadPart); return 0; }
四,如果是在linux平台下面呢?
时间的测量有多种方式。一种是C语言库函数 time(),它可以提供秒级的计时,比较粗糙。
一种是C语言库函数gettimeofday(),大约可以精确到微妙,但会受到CPU调度的影响。
一种是时间戳计时器(Time Stamp Counter),可以达到纳秒级计时精度。
1)time 命令 — 执行命令并计时
time find . -name "*.c" |xargs wc -l // 统计执行命令时间
real 0m33.748s
user 0m0.772s
sys 0m1.044s
(1)实际时间(real time): 从command命令行开始执行到运行终止的消逝时间;
(2)用户CPU时间(user CPU time): 命令执行完成花费的用户CPU时间,即命令在用户态中执行时间总和;
(3)系统CPU时间(system CPU time): 命令执行完成花费的系统CPU时间,即命令在核心态中执行时间总和。
其中,用户CPU时间和系统CPU时间之和为CPU时间,即命令占用CPU执行的时间总和。实际时间要大于CPU时间,因为Linux是多任务操作系统,往往在执行一条命令时,系统还要处理其它任务。
另一个需要注意的问题是即使每次执行相同命令,但所花费的时间也是不一样,其花费时间是与系统运行相关的。
2)微秒级测量方法
struct timeval
{
long tv_sec; //秒域
long tv_usec; //微妙域
}
(tvend.tv_sec-tvstart.tv_sec)+(tvend.tv_usec-tvstart.tv_usec)/1000000 = 以秒为单位的计时时间。
以下得到以微秒为计时单位的时间
#include <sys/time.h> #include "stdio.h" int main() { struct timeval tstart,tend; gettimeofday(&tstart,NULL); for(int i=0;i<10000;++i) printf(""); gettimeofday(&tend,NULL); long int use_useconds=1000000*(tend.tv_sec - tstart.tv_sec) + (tend.tv_usec - tstart.tv_usec); printf("%ld\n",use_useconds); return 0; }