1 /* emacs edit mode for this file is -*- C++ -*- */
2 
3 /* It should be possible to include this file multiple times for different */
4 /* settings of TIMING */
5 
6 #undef TIMING_START
7 #undef TIMING_END
8 #undef TIMING_END_AND_PRINT
9 #undef TIMING_DEFINE_PRINT
10 #undef TIMING_DEFINE_PRINTPROTO
11 #undef TIMING_PRINT
12 
13 #ifdef TIMING
14 #include <time.h>
15 #if ! defined(WINNT) || defined(__GNUC__)
16 #include <sys/times.h>
17 #include <sys/param.h>
18 #endif
19 #ifndef NOSTREAMIO
20 #ifdef HAVE_CSTDIO
21 #include <cstdio>
22 #else
23 #include <stdio.h>
24 #endif
25 #endif
26 
27 // need to be adjusted on your machine:
28 // the number of ticks per second: HZ
29 #if ! defined (HZ) && defined (CLOCKS_PER_SEC)
30 #define HZ CLOCKS_PER_SEC
31 #endif
32 #if ! defined (HZ)  && defined (CLK_TCK)
33 #define HZ CLK_TCK
34 #endif
35 #ifndef HZ
36 #ifdef sun
37 #define HZ 60.0
38 #else
39 #define HZ 100.0
40 #endif
41 #endif
42 
43 #if defined(WINNT) && ! defined(__GNUC__)
44 
45 #define TIMING_DEFINE(t) static clock_t timing_ ## t ## _start, timing_ ## t ## _end; \
46 static clock_t timing_ ## t ## _time;
47 #define TIMING_START(t) timing_ ## t ## _start = clock();
48 #define TIMING_END(t) timing_ ## t ## _end = clock(); \
49 timing_ ## t ## _time += timing_ ## t ## _end - timing_ ## t ## _start;
50 #define TIMING_END_AND_PRINT(t, msg) times( &timing_ ## t ## _end ); \
51   fprintf( stderr, "%s%.2f sec\n", msg, \
52            float( timing_ ## t ## _end - timing_ ## t ## _start ) / HZ ); \
53   timing_ ## t ## _time += timing_ ## t ## _end - timing_ ## t ## _start;
54 #define TIMING_DEFINE_PRINT(t) static clock_t timing_ ## t ## _start, timing_ ## t ## _end; \
55 static clock_t timing_ ## t ## _time; \
56 static void timing_print_ ## t ( char * msg ) { \
57   fprintf( stderr, "%s%.2f sec\n", msg, float(timing_ ## t ## _time) / HZ ); \
58 } \
59 static void timing_reset_ ## t () { \
60   timing_ ## t ## _time = 0; \
61 }
62 
63 #else /* ! WINNT */
64 
65 #define TIMING_DEFINE(t) static struct tms timing_ ## t ## _start, timing_ ## t ## _end; \
66 static long timing_ ## t ## _time;
67 #define TIMING_START(t) times( &timing_ ## t ## _start );
68 #define TIMING_END(t) times( &timing_ ## t ## _end ); \
69   timing_ ## t ## _time += timing_ ## t ## _end.tms_utime - timing_ ## t ## _start.tms_utime;
70 #define TIMING_END_AND_PRINT(t, msg) times( &timing_ ## t ## _end ); \
71   fprintf( stderr, "%s%.2f sec\n", msg, \
72            float( timing_ ## t ## _end.tms_utime - timing_ ## t ## _start.tms_utime ) / HZ ); \
73   timing_ ## t ## _time += timing_ ## t ## _end.tms_utime - timing_ ## t ## _start.tms_utime;
74 #define TIMING_DEFINE_PRINT(t) static struct tms timing_ ## t ## _start, timing_ ## t ## _end; \
75 static long timing_ ## t ## _time; \
76 static void timing_print_ ## t ( char * msg ) { \
77   fprintf( stderr, "%s%.2f sec\n", msg, float(timing_ ## t ## _time) / HZ ); \
78 } \
79 static void timing_reset_ ## t () { \
80   timing_ ## t ## _time = 0; \
81 }
82 #endif /* ! WINNT */
83 
84 /* macros common to all platforms */
85 #define TIMING_DEFINE_PRINTPROTO(t) void timing_print_ ## t ( char * ); \
86   void timing_reset_ ## t ();
87 #define TIMING_PRINT(t, msg) timing_print_ ## t ( msg );
88 #define TIMING_RESET(t) timing_reset_ ## t ();
89 
90 #else /* TIMING */
91 #define TIMING_DEFINE(t)
92 #define TIMING_START(t)
93 #define TIMING_END(t)
94 #define TIMING_END_AND_PRINT(t, msg)
95 #define TIMING_DEFINE_PRINT(t)
96 #define TIMING_DEFINE_PRINTPROTO(t)
97 #define TIMING_PRINT(t, msg)
98 #define TIMING_RESET(t)
99 #endif /* TIMING */
100