1 #ifndef __DMPROFILE_H__ 2 #define __DMPROFILE_H__ 3 4 #ifndef __cplusplus 5 #error "This is a C++ header file; it requires C++ to compile." 6 #endif 7 8 #ifdef DM_PERFORMANCE_ENABLED 9 10 #include "trace_perf.h" 11 12 #endif 13 14 enum { 15 DM_INITIALIZE_ENTER = 18000000, 16 DM_INITIALIZE_EXIT = 18000001, 17 DM_GET_TREE_ENTER = 18000002, 18 DM_GET_TREE_EXIT = 18000003, 19 DM_GET_NODE_ENTER = 18000004, 20 DM_GET_NODE_EXIT = 18000005, 21 DM_UNINITIALIZE_ENTER = 18000006, 22 DM_UNINITIALIZE_EXIT = 18000007, 23 DM_INITIALIZE_MOUNT = 18000008, 24 DM_INITIALIZE_MDF = 18000009, 25 DM_INITIALIZE_PLUGIN = 18000010, 26 DM_INITIALIZE_ACRHIVER = 18000011, 27 DM_INITIALIZE_FILE = 18000012, 28 DM_INITIALIZE_LOCK = 18000013, 29 DM_INITIALIZE_ACL = 18000014, 30 DM_INITIALIZE_EVENT = 18000015, 31 DM_INITIALIZE_LOAD = 18000016, 32 33 }; 34 35 36 #ifdef DM_PERFORMANCE_ENABLED 37 #define DM_PERFORMANCE(event) TRACE_PERF(event) 38 #else 39 #define DM_PERFORMANCE(event) 40 #endif 41 42 43 #ifdef DM_PROFILER_ENABLED 44 #include <sys/time.h> 45 #include <stdio.h> 46 #include <string.h> 47 48 #ifdef DEBUG 49 extern int s_nBlocks , s_nSize, s_nCnt; 50 #endif 51 52 // static storage for performance statistic 53 #define PROF_CELL_NUM 20000 54 struct CDMProfCell { 55 const char* _s; 56 long long _elapsed, _from; 57 }; 58 59 extern CDMProfCell g_aProfStorage[PROF_CELL_NUM]; 60 extern int g_nProfCurCell; 61 62 struct CDMProfile { 63 64 CDMProfile( const char* s) { 65 _s = s; 66 gettimeofday( &_tv1, NULL ); 67 #ifdef DEBUG 68 _nasBlocks = s_nBlocks; 69 _nWasSize = s_nSize; 70 _nWasTotal = s_nCnt; 71 #endif 72 } 73 ~CDMProfile() { 74 struct timeval tv2; 75 gettimeofday( &tv2, NULL ); 76 long long n1 = _tv1.tv_usec + (_tv1.tv_sec * 1000000 ); 77 long long n2 = tv2.tv_usec + (tv2.tv_sec * 1000000 ); 78 long long elapsed = n2 - n1; 79 //printf( "DMProfile: %s, time is %lld usec, from %lld to %lld\n", _s, elapsed, n1, n2 ); 80 int nCurCell = g_nProfCurCell++ % PROF_CELL_NUM; 81 g_aProfStorage[nCurCell]._s = strdup( _s ); 82 g_aProfStorage[nCurCell]._elapsed = elapsed; 83 g_aProfStorage[nCurCell]._from = n1; 84 85 #ifdef DEBUG 86 #ifdef DM_DM_MEMORY_USAGE_ENABLED 87 printf( "DMProfile: %s, time is %lld usec, from %lld to %lld\n", _s, elapsed, n1, n2 ); 88 89 printf( "Total Blocks %d (delta is %d), size %d (delta is %d), total allocated (including deallocated) %d, (d %d)\n\n", 90 s_nBlocks, s_nBlocks - _nasBlocks, 91 s_nSize, s_nSize - _nWasSize, 92 s_nCnt, s_nCnt - _nWasTotal ); 93 #endif 94 #endif 95 } 96 97 struct timeval _tv1; 98 const char* _s; 99 #ifdef DEBUG 100 int _nasBlocks, _nWasSize, _nWasTotal; 101 #endif 102 }; 103 104 #define DM_PROFILE_EXT(msg,num) CDMProfile __oProf##num(msg ); 105 #define DM_PROFILE(msg) CDMProfile __oProf(msg ); 106 107 #else 108 #define DM_PROFILE(msg) 109 #define DM_PROFILE_EXT(msg,num) 110 #endif 111 112 113 #ifdef DM_PROFILER_STACK 114 115 #include <sys/time.h> 116 #include <stdio.h> 117 #include <string.h> 118 #include "dmvector.h" 119 120 // static storage for performance statistic 121 #define PROF_STACK_NUM 20000 122 struct DMProfileData { 123 const char* _s; 124 long long _elapsed, _from; 125 }; 126 127 extern DMProfileData __aProfStackStorage[PROF_STACK_NUM]; 128 extern int g_nProfCurCell; 129 130 struct CDMProfileCapture { 131 132 CDMProfileCapture(DMStringVector itemNames, DMStringVector itemValues) { 133 _itemNames = itemNames; 134 _itemValues = itemValues; 135 gettimeofday( &_tv1, NULL ); 136 } 137 138 ~CDMProfileCapture() { 139 struct timeval tv2; 140 gettimeofday( &tv2, NULL ); 141 long long n1 = _tv1.tv_usec + (_tv1.tv_sec * 1000000 ); 142 long long n2 = tv2.tv_usec + (tv2.tv_sec * 1000000 ); 143 long long elapsed = n2 - n1; 144 145 DMString tmp = ""; 146 DMString tmpValue = ""; 147 148 for (int i = 0; i < _itemNames.size(); i++) { 149 tmp += " <"; 150 tmp += _itemNames[i]; 151 tmp += ">"; 152 tmpValue = _itemValues[i]; 153 154 tmpValue.replaceAll('<', '#'); 155 tmpValue.replaceAll('>', '#'); 156 157 tmp += tmpValue; 158 159 const char* ch = _itemValues[i].c_str(); 160 161 int size = strlen(ch); 162 163 if (ch[size - 1] == '\n') { 164 tmp += " </"; 165 } else { 166 tmp += "</"; 167 } 168 169 tmp += _itemNames[i]; 170 tmp += ">\n"; 171 } 172 173 int nCurCell = g_nProfCurCell++ % PROF_STACK_NUM; 174 __aProfStackStorage[nCurCell]._s = strdup(tmp.c_str()); 175 176 __aProfStackStorage[nCurCell]._elapsed = elapsed; 177 __aProfStackStorage[nCurCell]._from = n1; 178 } 179 180 struct timeval _tv1; 181 const char* _s; 182 DMStringVector _itemNames; 183 DMStringVector _itemValues; 184 }; 185 186 #define DM_PROFILE_STACK(itemNames, itemValues) CDMProfileCapture __oProfStack(itemNames, itemValues); 187 188 #else 189 #define DM_PROFILE_STACK(itemNames, itemValues) 190 #endif 191 192 193 #ifdef DM_FILE_OUTPUT 194 void DMFileOutput( const char* szFormat, ... ); 195 #else 196 #define DMFileOutput 197 #endif 198 199 #endif // __DMPROFILE_H__ 200 201