HomeBlogMagic

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.

Permalink: https://adirmeier.de/Blog/ID_391
Tags: Blog, C/C++von am 2022-01-12