为了定时精度或者程序性能优化,我们需要精度比较高的时间函数,本文结束c,c++的精确定时函数。
下面例子来自:
Acquiring high-resolution time stamps - Win32 apps | Microsoft Learn
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;
StartingTime = KeQueryPerformanceCounter(&Frequency);
// Activity to be timed
EndingTime = KeQueryPerformanceCounter(NULL);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
看看:StartingTime = KeQueryPerformanceCounter(&Frequency);
这个函数的结果是 当时的记数值,单位是脉冲数,起点是开机时,Frequency 返回的是频率。
上面代码是个演示,不能直接编译链接运行。下面是我在msvc2019 下调试好的代码:
#include "windows.h"
#include"winnt.h"
#include "profileapi.h"
#include "stdio.h"
int main()
{
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&StartingTime);
// Activity to be timed
Sleep(50);
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
//
// We now have the elapsed number of ticks, along with the
// number of ticks-per-second. We use these values
// to convert to the number of elapsed microseconds.
// To guard against loss-of-precision, we convert
// to microseconds *before* dividing by ticks-per-second.
//
double lap = ElapsedMicroseconds.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
lap *= 1000000;
lap /= Frequency.QuadPart;
printf("useconds=%f,freq=%ld\n", lap, Frequency.QuadPart);
}