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
我目前正在做的项目使用的是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