summaryrefslogtreecommitdiff
path: root/zen/perf.h
diff options
context:
space:
mode:
Diffstat (limited to 'zen/perf.h')
-rw-r--r--zen/perf.h69
1 files changed, 62 insertions, 7 deletions
diff --git a/zen/perf.h b/zen/perf.h
index 874e6093..ea8991a8 100644
--- a/zen/perf.h
+++ b/zen/perf.h
@@ -7,14 +7,21 @@
#ifndef DEBUG_PERF_HEADER
#define DEBUG_PERF_HEADER
-#include <sstream>
#include "deprecate.h"
+
+#ifdef FFS_WIN
+#include <sstream>
#include "win.h" //includes "windows.h"
+#else
+#include <iostream>
+#include <time.h>
+#endif
//two macros for quick performance measurements
#define PERF_START CpuTimer perfTest;
#define PERF_STOP perfTest.showResult();
+#ifdef FFS_WIN
class CpuTimer
{
public:
@@ -24,8 +31,10 @@ public:
CpuTimer() : frequency(), startTime(), resultShown(false)
{
SetThreadAffinity dummy;
- if (!::QueryPerformanceFrequency(&frequency)) throw TimerError();
- if (!::QueryPerformanceCounter (&startTime)) throw TimerError();
+ if (!::QueryPerformanceFrequency(&frequency))
+ throw TimerError();
+ if (!::QueryPerformanceCounter (&startTime))
+ throw TimerError();
}
~CpuTimer()
@@ -38,16 +47,18 @@ public:
{
SetThreadAffinity dummy;
LARGE_INTEGER currentTime = {};
- if (!::QueryPerformanceCounter(&currentTime)) throw TimerError();
+ if (!::QueryPerformanceCounter(&currentTime))
+ throw TimerError();
- const long delta = static_cast<long>(1000.0 * (currentTime.QuadPart - startTime.QuadPart) / frequency.QuadPart);
+ const auto delta = static_cast<long>(1000.0 * (currentTime.QuadPart - startTime.QuadPart) / frequency.QuadPart);
std::ostringstream ss;
ss << delta << " ms";
- ::MessageBoxA(NULL, ss.str().c_str(), "Timer", 0);
+ ::MessageBoxA(nullptr, ss.str().c_str(), "Timer", 0);
resultShown = true;
- if (!::QueryPerformanceCounter(&startTime)) throw TimerError(); //don't include call to MessageBox()!
+ if (!::QueryPerformanceCounter(&startTime))
+ throw TimerError(); //don't include call to MessageBox()!
}
private:
@@ -57,6 +68,8 @@ private:
SetThreadAffinity() : oldmask(::SetThreadAffinityMask(::GetCurrentThread(), 1)) { if (oldmask == 0) throw TimerError(); }
~SetThreadAffinity() { ::SetThreadAffinityMask(::GetCurrentThread(), oldmask); }
private:
+ SetThreadAffinity(const SetThreadAffinity&);
+ SetThreadAffinity& operator=(const SetThreadAffinity&);
const DWORD_PTR oldmask;
};
@@ -65,4 +78,46 @@ private:
bool resultShown;
};
+
+#else
+class CpuTimer
+{
+public:
+ class TimerError {};
+
+ ZEN_DEPRECATE
+ CpuTimer() : startTime(), resultShown(false)
+ {
+ //clock() seems to give grossly incorrect results: multi core issue?
+ //gettimeofday() seems fine but is deprecated
+ if (::clock_gettime(CLOCK_MONOTONIC_RAW, &startTime) != 0) //CLOCK_MONOTONIC measures time reliably across processors!
+ throw TimerError();
+ }
+
+ ~CpuTimer()
+ {
+ if (!resultShown)
+ showResult();
+ }
+
+ void showResult()
+ {
+ timespec currentTime = {};
+ if (::clock_gettime(CLOCK_MONOTONIC_RAW, &currentTime) != 0)
+ throw TimerError();
+
+ const auto delta = static_cast<long>((currentTime.tv_sec - startTime.tv_sec) * 1000.0 + (currentTime.tv_nsec - startTime.tv_nsec) / 1000000.0);
+ std::clog << "Perf: duration: " << delta << " ms\n";
+ resultShown = true;
+
+ if (::clock_gettime(CLOCK_MONOTONIC_RAW, &startTime) != 0)
+ throw TimerError();
+ }
+
+private:
+ timespec startTime;
+ bool resultShown;
+};
+#endif
+
#endif //DEBUG_PERF_HEADER
bgstack15