]> git.donarmstrong.com Git - mothur.git/blobdiff - uchime_src/timing.h
added uchime_src folder. added biom parameter to make.shared. added biom as a current...
[mothur.git] / uchime_src / timing.h
diff --git a/uchime_src/timing.h b/uchime_src/timing.h
new file mode 100644 (file)
index 0000000..0a80aee
--- /dev/null
@@ -0,0 +1,238 @@
+#define TIMING 0
+#ifndef timing_h
+#define timing_h
+
+#define BG_TIMING      0
+
+#if !TIMING
+#undef BG_TIMING
+#define BG_TIMING      0
+#endif
+
+#if    UCHIMES
+#undef TIMING
+#define TIMING 0
+#endif
+
+#if TIMING
+
+enum TIMER
+       {
+       TIMER_None,
+#define T(x)   TIMER_##x,
+#include "timers.h"
+#undef T
+       };
+
+const unsigned TimerCount =
+       1       // TIMER_None
+#define T(x)   +1
+#include "timers.h"
+#undef T
+       ;
+
+enum COUNTER
+       {
+#define C(x)   COUNTER_##x,
+#include "counters.h"
+#undef C
+       };
+
+enum ALLOCER
+       {
+#define A(x)   ALLOCER_##x,
+#include "allocs.h"
+#undef A
+       };
+
+const unsigned CounterCount =
+#define C(x)   +1
+#include "counters.h"
+#undef C
+       ;
+
+const unsigned AllocerCount =
+#define A(x)   +1
+#include "allocs.h"
+#undef A
+       ;
+
+#ifdef _MSC_VER
+
+typedef unsigned __int64 TICKS;
+
+#pragma warning(disable:4035)
+inline TICKS GetClockTicks()
+       {
+       _asm
+               {
+               _emit   0x0f
+               _emit   0x31
+               }
+       }
+
+#else  // ifdef _MSC_VER
+
+typedef uint64_t TICKS;
+__inline__ uint64_t GetClockTicks()
+       {
+       uint32_t lo, hi;
+       /* We cannot use "=A", since this would use %rax on x86_64 */
+       __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
+       return (uint64_t)hi << 32 | lo;
+       }
+
+#endif // ifdef _MSC_VER
+
+//void AddTicks(const string &Name, TICKS Ticks1, TICKS Ticks2);
+//void AddBytes(const string &Name, double Bytes);
+//#define SubBytes(Name, Bytes)        AddBytes(Name, -double(Bytes))
+
+const char *TimerToStr(TIMER t);
+
+extern TICKS g_BeginTicks[TimerCount];
+extern double g_TotalTicks[TimerCount];
+extern double g_TotalCounts[TimerCount];
+extern double g_Counters[CounterCount];
+extern unsigned g_AllocNewCount[AllocerCount];
+extern unsigned g_AllocFreeCount[AllocerCount];
+extern double g_AllocNewBytes[AllocerCount];
+extern double g_AllocFreeBytes[AllocerCount];
+extern double g_AllocNetBytes[AllocerCount];
+extern double g_AllocPeakBytes[AllocerCount];
+extern bool g_Timer2[TimerCount];
+extern TIMER g_CurrTimer;
+#if    BG_TIMING
+extern TIMER g_BackgroundTimer;
+#endif
+
+#define MYALLOC(Type, N, Name)         (Type *) MyAlloc_((N)*sizeof(Type), ALLOCER_##Name, __FILE__, __LINE__)
+#define MYFREE(Array, N, Name)         MyFree_(Array, N*sizeof(Array[0]), ALLOCER_##Name, __FILE__, __LINE__)
+
+inline void *MyAlloc_(unsigned Bytes, unsigned a, const char *FileName, int Line)
+       {
+       ++g_AllocNewCount[a];
+       g_AllocNewBytes[a] += Bytes;
+       g_AllocNetBytes[a] += Bytes;
+       if (g_AllocNetBytes[a] > g_AllocPeakBytes[a])
+               g_AllocPeakBytes[a] = g_AllocNetBytes[a];
+       return mymalloc(Bytes);
+       }
+
+inline void MyFree_(void *p, unsigned Bytes, unsigned a, const char *FileName, int Line)
+       {
+       ++g_AllocFreeCount[a];
+       g_AllocFreeBytes[a] += Bytes;
+       g_AllocNetBytes[a] -= Bytes;
+       myfree2(p, Bytes);
+       }
+
+#if    BG_TIMING
+inline void SetBackgroundTimer_(TIMER Timer)
+       {
+       TICKS Now = GetClockTicks();
+       if (g_BeginTicks[g_BackgroundTimer] != 0)
+               {
+               ++g_TotalCounts[g_BackgroundTimer];
+               g_TotalTicks[g_BackgroundTimer] += double(Now - g_BeginTicks[g_BackgroundTimer]);
+               }
+       g_BackgroundTimer = Timer;
+       g_BeginTicks[Timer] = Now;
+       }
+#else
+#define SetBackgroundTimer_(Timer)     /* empty */
+#endif
+
+inline void StartTimer_(TIMER Timer)
+       {
+       if (g_CurrTimer != TIMER_None)
+               Die("StartTimer(%s), curr=%s", TimerToStr(Timer), TimerToStr(g_CurrTimer));
+
+       TICKS Now = GetClockTicks();
+#if    BG_TIMING
+       if (g_BeginTicks[g_BackgroundTimer] != 0)
+               {
+               ++g_TotalCounts[g_BackgroundTimer];
+               g_TotalTicks[g_BackgroundTimer] += double(Now - g_BeginTicks[g_BackgroundTimer]);
+               }
+#endif
+       g_BeginTicks[Timer] = Now;
+       g_CurrTimer = Timer;
+       }
+
+inline void PauseTimer_(TIMER Timer)
+       {
+       if (Timer != g_CurrTimer)
+               Die("PauseTimer(%s), curr=%s", TimerToStr(Timer), TimerToStr(g_CurrTimer));
+
+       TICKS Now = GetClockTicks();
+       g_TotalTicks[Timer] += double(Now - g_BeginTicks[Timer]);
+       g_BeginTicks[Timer] = Now;
+       g_CurrTimer = TIMER_None;
+       }
+
+inline void EndTimer_(TIMER Timer)
+       {
+       if (Timer != g_CurrTimer)
+               Die("EndTimer(%s), curr=%s", TimerToStr(Timer), TimerToStr(g_CurrTimer));
+
+       TICKS Now = GetClockTicks();
+#if    BG_TIMING
+       g_BeginTicks[g_BackgroundTimer] = Now;
+#endif
+       g_TotalTicks[Timer] += double(Now - g_BeginTicks[Timer]);
+       ++g_TotalCounts[Timer];
+       g_CurrTimer = TIMER_None;
+       }
+
+inline void StartTimer2_(TIMER Timer)
+       {
+       g_Timer2[Timer] = true;
+       g_BeginTicks[Timer] = GetClockTicks();
+       }
+
+inline void EndTimer2_(TIMER Timer)
+       {
+       g_TotalTicks[Timer] += double(GetClockTicks() - g_BeginTicks[Timer]);
+       ++g_TotalCounts[Timer];
+       }
+
+#define AddCounter(x, N)       g_Counters[COUNTER_##x] += N
+#define IncCounter(x)          ++(g_Counters[COUNTER_##x])
+#define StartTimer(x)          StartTimer_(TIMER_##x)
+#define PauseTimer(x)          PauseTimer_(TIMER_##x)
+#define EndTimer(x)                    EndTimer_(TIMER_##x)
+#define StartTimer2(x)         StartTimer2_(TIMER_##x)
+#define EndTimer2(x)           EndTimer2_(TIMER_##x)
+
+#if    BG_TIMING
+#define SetBackgroundTimer(x)  SetBackgroundTimer_(TIMER_##x)
+#else
+#define SetBackgroundTimer(x)  /* empty */
+#endif
+
+#else  // if TIMING
+
+#define AddCounter(x, N)       /* empty */
+#define IncCounter(x)          /* empty */
+#define StartTimer(x)          /* empty */
+#define PauseTimer(x)          /* empty */
+#define EndTimer(x)                    /* empty */
+#define StartTimer2(x)         /* empty */
+#define PauseTimer2(x)         /* empty */
+#define EndTimer2(x)           /* empty */
+#define SetBackgroundTimer(x)  /* empty */
+#define MYALLOC(Type, N, Name)         myalloc(Type, N)
+#define MYFREE(Array, N, Name)         myfree(Array)
+
+#endif // if TIMING
+
+void LogMemStats();
+void LogTickStats();
+void LogStats();
+void LogAllocs();
+
+#define AddBytes(x, n) /* empty */
+#define SubBytes(x, n) /* empty */
+
+#endif // if timing_h