C++ runtime Zeitmessung vereinfachen
Um die Zeiten im code zu messen habe ich mir ein einfaches konzept überlegt um das ganze inline zu machen. Bisher habe ich das nur für Windows implementiert, eine implementierung für Linux wird noch folgen
typedef struct
{
FILETIME oStartTime;
FILETIME oStopTime;
} STimeObject;
#define StartMeasurement(NAME) \
STimeObject NAME; \
GetSystemTimeAsFileTime(&NAME.oStartTime);
inline uint64_t StopMeasurement(STimeObject& oTimes)
{
GetSystemTimeAsFileTime(&oTimes.oStopTime);
UINT64 uiStartTime = ((UINT64) oTimes.oStartTime.dwHighDateTime << 32) | oTimes.oStartTime.dwLowDateTime;
UINT64 uiEndTime = ((UINT64) oTimes.oStopTime.dwHighDateTime << 32) | oTimes.oStopTime.dwLowDateTime;
return (uiEndTime - uiStartTime) * 100;
}
int main(int iArgc, char* ppArgv[])
{
StartMeasurement(ReadTime);
// Things to be measured
uint64_t uiTimeInNs = StopMeasurement(ReadTime);
return 0;
}
Für Linux benutze ich die chrono implementierung seit std11
#include <chrono>
typedef struct
{
std::chrono::system_clock::time_point oStartTime;
std::chrono::system_clock::time_point oStopTime;
} STimeObject;
#define StartMeasurement(NAME) \
STimeObject NAME; \
NAME.oStartTime = std::chrono::high_resolution_clock::now();
inline uint64_t StopMeasurement(STimeObject& oTimes)
{
oTimes.oStopTime = std::chrono::high_resolution_clock::now();
uint64_t uiMeasuredTime = std::chrono::duration_cast<std::chrono::milliseconds>(oTimes.oStopTime - oTimes.oStartTime).count();
return uiMeasuredTime;
}
Die main aus dem ersten Beispiel kann hier genauso weiter verwendet werden.