summaryrefslogtreecommitdiff
path: root/blossom5-v2.05.src/timer.h
blob: a0b9373c0553444236e3f044e15f88b027524b57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#ifndef NJAKSDTHASKJERAXJGFBZJDLAGZ
#define NJAKSDTHASKJERAXJGFBZJDLAGZ

// At most one of the flags
//    PM_TIMER_MSVC
//    PM_TIMER_CLOCK_GETTIME
//    PM_TIMER_GETRUSAGE
//    PM_TIMER_EXTERNAL
//    PM_TIMER_NONE
// can be defined externally. If PM_TIMER_EXTERNAL is defined,
// then there must exist a definition of function "double get_time()" elsewhere.

#if defined (PM_TIMER_MSVC) || defined (PM_TIMER_CLOCK_GETTIME) || defined (PM_TIMER_GETRUSAGE) || defined (PM_TIMER_EXTERNAL) || defined (PM_TIMER_NONE)
#else
	// default option
	#ifdef _MSC_VER
		#define PM_TIMER_MSVC
	#elif defined(__APPLE_CC__)
		#define PM_TIMER_GETRUSAGE
	#else
		#define PM_TIMER_CLOCK_GETTIME
	#endif
#endif

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

#ifdef PM_TIMER_MSVC

	#include <windows.h>

	inline double get_time()
	{
		LARGE_INTEGER t, frequency;
		QueryPerformanceCounter(&t);
		QueryPerformanceFrequency(&frequency);
		return (double)t.QuadPart/(double)frequency.QuadPart;
	}

#endif

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

#ifdef PM_TIMER_CLOCK_GETTIME

	#include <time.h>

	inline double get_time()
	{
		struct timespec t;
		clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t);
		return (double)t.tv_nsec*1.00E-9 + (double)t.tv_sec;
	}

#endif

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

#ifdef PM_TIMER_GETRUSAGE

	#include <sys/resource.h>

	inline double get_time()
	{
		struct rusage t;
		getrusage (RUSAGE_SELF, &t);
		return (double)t.ru_utime.tv_usec*1.00E-6 + (double)t.ru_utime.tv_sec;
	}

#endif

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

#ifdef PM_TIMER_EXTERNAL

	extern double get_time();

#endif

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

#ifdef PM_TIMER_NONE

	inline double get_time() { return 0; }

#endif

#endif