定义并实现统计代码执行时间的类

///

1<summary>   
2/// Copyright (c) 2002, AllAboutProgram BBS.   
3/// All rights reserved.   
4///   
5/// 文件:PerformTime.h   
6/// 摘要:定义并实现统计代码执行时间的类   
7/// </summary>

///
///

1<remark>   
2/// 当前版本:1.0   
3/// 作 者:小刀   
4/// 完成日期:2002年9月18日   
5/// </remark>

#ifndef PERFORMTIME_H
#define PERFORMTIME_H

#include

  1<windows.h>   
  2#include <string>   
  3#include <sstream>
  4
  5/// <summary> 代码执行时间类 </summary>   
  6class CPerformTime   
  7{   
  8public:   
  9/// <summary> 缺省构造函数 </summary>   
 10CPerformTime()   
 11{   
 12m_llStartCount = 0;   
 13m_llEndCount = 0;   
 14m_ldDiffSeconds = 0; 
 15
 16// 高精度运行计数器的频率   
 17m_bSupported = QueryPerformanceFrequency((PLARGE_INTEGER)&amp;m_llFrequency);   
 18if (!m_bSupported)   
 19{   
 20// 不支持高精度运行计数器   
 21std::cout &lt;&lt; "QueryPerformance functions are not supported!\n\n";   
 22}   
 23} 
 24
 25/// <summary> 开始统计 </summary>   
 26/// <returns> 开始统计时高精度运行计数器的数值 </returns>   
 27LONGLONG Start()   
 28{   
 29m_ldDiffSeconds = 0;   
 30if (m_bSupported)   
 31{   
 32// 记录高精度运行计数器的数值   
 33QueryPerformanceCounter((PLARGE_INTEGER)&amp;m_llStartCount);   
 34}   
 35else   
 36{   
 37// 不支持高精度运行计数器   
 38std::cout &lt;&lt; "QueryPerformance functions are not supported!\n\n";   
 39}   
 40return m_llStartCount;   
 41} 
 42
 43/// <summary> 结束统计 </summary>   
 44/// <returns> 结束统计时高精度运行计数器的数值 </returns>   
 45LONGLONG Finish()   
 46{   
 47long lHours;   
 48long lMinutes;   
 49long double ldSeconds;   
 50std::ostringstream formatstr; 
 51
 52if (m_bSupported)   
 53{   
 54// 记录高精度运行计数器的数值   
 55QueryPerformanceCounter((PLARGE_INTEGER)&amp;m_llEndCount); 
 56
 57// 计算以秒为单位的运行时间   
 58m_ldDiffSeconds = (long double)(m_llEndCount - m_llStartCount) / (long double)m_llFrequency; 
 59
 60// 分离运行时间的时分秒   
 61lHours = m_ldDiffSeconds / 3600;   
 62lMinutes = (m_ldDiffSeconds - lHours * 3600) / 60;   
 63ldSeconds = m_ldDiffSeconds - lHours * 3600 - lMinutes * 60; 
 64
 65// 格式化运行时间字符串   
 66formatstr &lt;&lt; lHours &lt;&lt; " hours " &lt;&lt; lMinutes &lt;&lt; " minutes and " &lt;&lt; ldSeconds &lt;&lt; " seconds";   
 67m_strDiffTime = formatstr.str();   
 68}   
 69else   
 70{   
 71// 不支持高精度运行计数器   
 72std::cout &lt;&lt; "QueryPerformance functions are not supported!\n\n";   
 73}   
 74return m_llEndCount;   
 75} 
 76
 77/// <summary> 获得高精度运行计数器的频率 </summary>   
 78/// <returns> 高精度运行计数器的频率(单位:n/s) </returns>   
 79LONGLONG Frequency() const   
 80{   
 81return m_llFrequency;   
 82} 
 83
 84/// <summary> 获得开始统计时高精度运行计数器的数值 </summary>   
 85/// <returns> 开始统计时高精度运行计数器的数值 </returns>   
 86LONGLONG StartCount() const   
 87{   
 88return m_llStartCount;   
 89} 
 90
 91/// <summary> 获得结束统计时高精度运行计数器的数值 </summary>   
 92/// <returns> 结束统计时高精度运行计数器的数值 </returns>   
 93LONGLONG EndCount() const   
 94{   
 95return m_llEndCount;   
 96} 
 97
 98/// <summary> 获得代码运行时间 </summary>   
 99/// <returns> 代码运行时间(单位:s) </returns>   
100long double DiffSeconds() const   
101{   
102return m_ldDiffSeconds;   
103} 
104
105/// <summary> 获得代码运行时间 </summary>   
106/// <returns> 代码运行时间(字符串格式) </returns>   
107const std::string&amp; DiffTime() const   
108{   
109return m_strDiffTime;   
110} 
111
112private:   
113BOOL m_bSupported; // 是否支持高精度运行计数器   
114LONGLONG m_llFrequency; // 高精度运行计数器的频率(单位:n/s)   
115LONGLONG m_llStartCount; // 开始统计时高精度运行计数器的数值   
116LONGLONG m_llEndCount; // 结束统计时高精度运行计数器的数值   
117long double m_ldDiffSeconds; // 代码运行时间(单位:s)   
118std::string m_strDiffTime; // 字符串格式的代码运行时间   
119}; 
120
121#endif //PERFORMTIME_H 
122
123示例: 
124
125Code:   
126int main(int argc, char* argv[])   
127{   
128CPerformTime pt;   
129pt.Start();   
130long ert = 10000;   
131while (ert--)   
132;   
133pt.Finish();   
134cout &lt;&lt; "The frequency of the high-resolution performance counter is " &lt;&lt; (long)pt.Frequency() &lt;&lt; "/s.\n";   
135cout &lt;&lt; "The diff-count is " &lt;&lt; (long)(pt.EndCount() - pt.StartCount()) &lt;&lt; ".\n";   
136cout &lt;&lt; "The performance experienced " &lt;&lt; pt.DiffTime() &lt;&lt; "(total " &lt;&lt; pt.DiffSeconds() &lt;&lt; "s).\n\n";   
137return 0;   
138} 
139
140输出:   
141The frequency of the high-resolution performance counter is 3579545/s.   
142The diff-count is 434.   
143The performance experienced 0 hours 0 minutes and 0.000121244 seconds(total 0.000121244s). 
144
145精度:   
146约1/3微秒(3.33e-7秒)甚至更高。</sstream></string></windows.h>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus