MSVC 2008 更好的时机?

MSVC 2008 better timing?

我目前正在做的项目使用的是MSVC 2008,我对此没有任何选择。

使用它的操作系统是最新的 Windows10。我试图在应用程序中引入更准确的计时,但是到目前为止,我在网上完成的大部分搜索都是导致死胡同,是的,较新版本的 MSVC 确实支持更准确的计时,但我没有。

有什么方法可以提高时序的分辨率,不仅是分辨率,还有准确性。

我已经使用并在其他操作系统上工作,例如 QNX,在这些操作系统上很可能使用纳秒级精确计时器,而这是在更旧的硬件上。

Fudge:现在我正在考虑合并两个例程的结果,调用:

    GetLocalTime

对return大头数据,年月日时分秒使用:

    QueryPerformanceFrequency
    QueryPerformanceCounter

为了获取和计算微秒部分并屏蔽掉任何大于一秒的部分,所以我将小数部分保持到微秒。

这是我测试过的解决方案,结果很好:

    LARGE_INTEGER liFreq, liNow;
    SYSTEMTIME sstNow;       
    char szMsg[768];
    long lngMicro;
    /*Get high performance frequency and counter*/
    QueryPerformanceFrequency(&liFreq);
    QueryPerformanceCounter(&liNow);
    /*Work out elapsed microseconds using frequency*/
    liNow.QuadPart *= 1000000;
    liNow.QuadPart /= liFreq.QuadPart;
    /*Mask out everything >= 1 second */
    lngMicro = liNow.QuadPart % 1000000;
    /*Get the system date and time*/
    GetLocalTime(&sstNow);
    /*Build up formatted debug string including sequence number, line number
     *date and time stamp including microseconds and message detail*/
    sprintf_s(szMsg, sizeof(szMsg)
         ,"%4d-%02d-%02d %02d:%02d:%02d.%06ld DBG:%-24sL%05uSQ%05uET%16.6f%s%s\n"            
         ,sstNow.wYear, sstNow.wMonth, sstNow.wDay
         ,sstNow.wHour, sstNow.wMinute, sstNow.wSecond
         ,lngMicro, cpszClipped, uintLineNo
         ,suintDbgSeqNo, dblElapsed, sszIndents, cpszFormat);

这不是完整的功能,但希望能为任何人提供足够的信息来了解正在发生的事情以及它是如何工作的,这里是使用此技术生成的日志文件的片段:

    2018-05-16 08:17:52.334189 DBG:FsLonSource.cpp         L01079SQ00011ET        5.334189   CFsLonSource::SubmitCommand(AddressType:Local NI, Mode:0, Selector:0)
    2018-05-16 08:17:52.334449 DBG:NodetalkLONInterface.c  L01862SQ00012ET        5.334449     AdapterSetAddress(DomainId:, SubnetId:1, NodeId:1)
    2018-05-16 08:17:52.334807 DBG:NodetalkLONInterface.c  L01522SQ00013ET        5.334807       AdapterSetAddressInternal(DomainId:, SubnetId:1, NodeId:1)
    2018-05-16 08:17:52.335413 DBG:NodetalkLONInterface.c  L01021SQ00014ET        5.335413         NodeSetAddress(ServiceType: ACKD): ok
    2018-05-16 08:17:52.335603 DBG:NodetalkLONInterface.c  L01055SQ00015ET        5.335603         NodeSetModeState()
    2018-05-16 08:17:52.335783 DBG:NodetalkLONInterface.c  L01064SQ00016ET        5.335783           ServiceType: UNACKD
    2018-05-16 08:17:52.335966 DBG:NodetalkLONInterface.c  L01065SQ00017ET        5.335966           NewMode: ?
    2018-05-16 08:17:52.336124 DBG:NodetalkLONInterface.c  L01071SQ00018ET        5.336124           NewState: Configured, Online
    2018-05-16 08:17:52.339081 DBG:FsLonDispatch.cpp       L00342SQ00019ET        5.339081           CFsLonDispatch::ExecRequest(): S_OK
    2018-05-16 08:17:52.433098 DBG:FsLonDispatch.cpp       L00181SQ00020ET        5.433098         CFsLonDispatch::ExecRequest(request:"<UpdateRest xmln", lTimeout:0, destination:"", correlationId:"")
    2018-05-16 08:17:52.436138 DBG:FsLonDispatch.cpp       L00250SQ00021ET        5.436138           strCCommand: UpdateRest
    2018-05-16 08:17:52.436431 DBG:FsLonDispatch.cpp       L00342SQ00022ET        5.436431           CFsLonDispatch::ExecRequest(): S_OK
    2018-05-16 08:17:52.437184 DBG:FsLonDispatch.cpp       L00181SQ00023ET        5.437184         CFsLonDispatch::ExecRequest(request:"<UpdateRest xmln", lTimeout:0, destination:"", correlationId:"")
    2018-05-16 08:17:52.439981 DBG:FsLonDispatch.cpp       L00250SQ00024ET        5.439981           strCCommand: UpdateRest
    2018-05-16 08:17:52.440331 DBG:FsLonDispatch.cpp       L00342SQ00025ET        5.440331           CFsLonDispatch::ExecRequest(): S_OK
    2018-05-16 08:17:52.440705 DBG:FsLonDispatch.cpp       L00181SQ00026ET        5.440705         CFsLonDispatch::ExecRequest(request:"<UpdateRest xmln", lTimeout:0, destination:"", correlationId:"")
    2018-05-16 08:17:52.443586 DBG:FsLonDispatch.cpp       L00250SQ00027ET        5.443586           strCCommand: UpdateRest
    2018-05-16 08:17:52.443792 DBG:FsLonDispatch.cpp       L00342SQ00028ET        5.443792           CFsLonDispatch::ExecRequest(): S_OK
    2018-05-16 08:17:52.951870 DBG:NodetalkLONInterface.c  L01108SQ00029ET        5.951870         ServiceType: REQUEST
    2018-05-16 08:17:52.955944 DBG:NodetalkLONInterface.c  L01152SQ00030ET        5.955944         NodeSetModeState(): ok
    2018-05-16 08:17:52.956289 DBG:NodetalkLONInterface.c  L01555SQ00031ET        5.956289       AdapterSetAddressInternal(): ok
    2018-05-16 08:17:52.956655 DBG:NodetalkLONInterface.c  L01597SQ00032ET        5.956655     AdapterSetRcvTimer(ServiceType: REQUEST, AddressType: LOCAL)
    2018-05-16 08:17:52.966897 DBG:NodetalkLONInterface.c  L01625SQ00033ET        5.966897       AdapterSetRcvTimer(): ok
    2018-05-16 08:17:52.967216 DBG:NodetalkLONInterface.c  L01878SQ00034ET        5.967216     AdapterSetAddress(): ok
    2018-05-16 08:17:52.967531 DBG:FsLonSource.cpp         L01174SQ00035ET        5.967531   CFsLonSource::SubmitCommand(): ok