3 // TortoiseSVN - a Windows shell extension for easy version control
\r
5 // Copyright (C) 2003-2008 - TortoiseSVN
\r
7 // This program is free software; you can redistribute it and/or
\r
8 // modify it under the terms of the GNU General Public License
\r
9 // as published by the Free Software Foundation; either version 2
\r
10 // of the License, or (at your option) any later version.
\r
12 // This program is distributed in the hope that it will be useful,
\r
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
15 // GNU General Public License for more details.
\r
17 // You should have received a copy of the GNU General Public License
\r
18 // along with this program; if not, write to the Free Software Foundation,
\r
19 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
22 //////////////////////////////////////////////////////////////////////
\r
23 // required includes
\r
24 //////////////////////////////////////////////////////////////////////
\r
44 #pragma comment (lib, "psapi.lib")
\r
47 * Collects the profiling info for a given profiled block / line.
\r
48 * Records execution count, min, max and accumulated execution time
\r
49 * in CPU clock ticks.
\r
52 class CProfilingRecord
\r
62 /// collected profiling info
\r
65 unsigned __int64 sum;
\r
66 unsigned __int64 minValue;
\r
67 unsigned __int64 maxValue;
\r
73 CProfilingRecord ( const char* name
\r
79 void Add (unsigned __int64 value);
\r
87 const char* GetName() const {return name;}
\r
88 const char* GetFile() const {return file;}
\r
89 int GetLine() const {return line;}
\r
91 size_t GetCount() const {return count;}
\r
92 unsigned __int64 GetSum() const {return sum;}
\r
93 unsigned __int64 GetMinValue() const {return minValue;}
\r
94 unsigned __int64 GetMaxValue() const {return maxValue;}
\r
98 * RAII class that encapsulates a single execution of a profiled
\r
99 * block / line. The result gets added to an existing profiling record.
\r
102 class CRecordProfileEvent
\r
106 CProfilingRecord* record;
\r
108 /// the initial CPU counter value
\r
110 unsigned __int64 start;
\r
114 /// construction: start clock
\r
116 CRecordProfileEvent (CProfilingRecord* aRecord);
\r
118 /// destruction: time interval to profiling record,
\r
119 /// if Stop() had not been called before
\r
121 ~CRecordProfileEvent();
\r
123 /// don't wait for destruction
\r
130 /// construction / destruction
\r
132 inline CRecordProfileEvent::CRecordProfileEvent (CProfilingRecord* aRecord)
\r
134 , start (__rdtsc())
\r
138 inline CRecordProfileEvent::~CRecordProfileEvent()
\r
141 record->Add (__rdtsc() - start);
\r
146 /// don't wait for destruction
\r
148 inline void CRecordProfileEvent::Stop()
\r
152 record->Add (__rdtsc() - start);
\r
158 * Singleton class that acts as container for all profiling records.
\r
159 * You may reset its content as well as write it to disk.
\r
162 class CProfilingInfo
\r
166 typedef std::vector<CProfilingRecord*> TRecords;
\r
169 /// construction / destruction
\r
172 ~CProfilingInfo(void);
\r
176 std::string GetReport() const;
\r
180 /// access to default instance
\r
182 static CProfilingInfo* GetInstance();
\r
184 /// add a new record
\r
186 CProfilingRecord* Create ( const char* name
\r
195 #define PROFILE_CONCAT3( a, b ) a##b
\r
196 #define PROFILE_CONCAT2( a, b ) PROFILE_CONCAT3( a, b )
\r
197 #define PROFILE_CONCAT( a, b ) PROFILE_CONCAT2( a, b )
\r
199 /// measures the time from the point of usage to the end of the respective block
\r
201 #define PROFILE_BLOCK\
\r
202 static CProfilingRecord* PROFILE_CONCAT(record,__LINE__) \
\r
203 = CProfilingInfo::GetInstance()->Create(__FUNCTION__,__FILE__,__LINE__);\
\r
204 CRecordProfileEvent PROFILE_CONCAT(profileSection,__LINE__) (PROFILE_CONCAT(record,__LINE__));
\r
206 /// measures the time taken to execute the respective code line
\r
208 #define PROFILE_LINE(line)\
\r
209 static CProfilingRecord* PROFILE_CONCAT(record,__LINE__) \
\r
210 = CProfilingInfo::GetInstance()->Create(__FUNCTION__,__FILE__,__LINE__);\
\r
211 CRecordProfileEvent PROFILE_CONCAT(profileSection,__LINE__) (PROFILE_CONCAT(record,__LINE__));\
\r
213 PROFILE_CONCAT(profileSection,__LINE__).Stop();
\r