///
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)&m_llFrequency);
18if (!m_bSupported)
19{
20// 不支持高精度运行计数器
21std::cout << "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)&m_llStartCount);
34}
35else
36{
37// 不支持高精度运行计数器
38std::cout << "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)&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 << lHours << " hours " << lMinutes << " minutes and " << ldSeconds << " seconds";
67m_strDiffTime = formatstr.str();
68}
69else
70{
71// 不支持高精度运行计数器
72std::cout << "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& 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 << "The frequency of the high-resolution performance counter is " << (long)pt.Frequency() << "/s.\n";
135cout << "The diff-count is " << (long)(pt.EndCount() - pt.StartCount()) << ".\n";
136cout << "The performance experienced " << pt.DiffTime() << "(total " << pt.DiffSeconds() << "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>