/// <summary>
/// Copyright (c) 2002, AllAboutProgram BBS.
/// All rights reserved.
///
/// 文件:PerformTime.h
/// 摘要:定义并实现统计代码执行时间的类
/// </summary>
///
/// <remark>
/// 当前版本:1.0
/// 作 者:小刀
/// 完成日期:2002年9月18日
/// </remark>
#ifndef PERFORMTIME_H
#define PERFORMTIME_H
#include <windows.h>
#include <string>
#include <sstream>
/// <summary> 代码执行时间类 </summary>
class CPerformTime
{
public:
/// <summary> 缺省构造函数 </summary>
CPerformTime()
{
m_llStartCount = 0;
m_llEndCount = 0;
m_ldDiffSeconds = 0;
// 高精度运行计数器的频率
m_bSupported = QueryPerformanceFrequency((PLARGE_INTEGER)&m_llFrequency);
if (!m_bSupported)
{
// 不支持高精度运行计数器
std::cout << "QueryPerformance functions are not supported!\n\n";
}
}
/// <summary> 开始统计 </summary>
/// <returns> 开始统计时高精度运行计数器的数值 </returns>
LONGLONG Start()
{
m_ldDiffSeconds = 0;
if (m_bSupported)
{
// 记录高精度运行计数器的数值
QueryPerformanceCounter((PLARGE_INTEGER)&m_llStartCount);
}
else
{
// 不支持高精度运行计数器
std::cout << "QueryPerformance functions are not supported!\n\n";
}
return m_llStartCount;
}
/// <summary> 结束统计 </summary>
/// <returns> 结束统计时高精度运行计数器的数值 </returns>
LONGLONG Finish()
{
long lHours;
long lMinutes;
long double ldSeconds;
std::ostringstream formatstr;
if (m_bSupported)
{
// 记录高精度运行计数器的数值
QueryPerformanceCounter((PLARGE_INTEGER)&m_llEndCount);
// 计算以秒为单位的运行时间
m_ldDiffSeconds = (long double)(m_llEndCount - m_llStartCount) / (long double)m_llFrequency;
// 分离运行时间的时分秒
lHours = m_ldDiffSeconds / 3600;
lMinutes = (m_ldDiffSeconds - lHours * 3600) / 60;
ldSeconds = m_ldDiffSeconds - lHours * 3600 - lMinutes * 60;
// 格式化运行时间字符串
formatstr << lHours << " hours " << lMinutes << " minutes and " << ldSeconds << " seconds";
m_strDiffTime = formatstr.str();
}
else
{
// 不支持高精度运行计数器
std::cout << "QueryPerformance functions are not supported!\n\n";
}
return m_llEndCount;
}
/// <summary> 获得高精度运行计数器的频率 </summary>
/// <returns> 高精度运行计数器的频率(单位:n/s) </returns>
LONGLONG Frequency() const
{
return m_llFrequency;
}
/// <summary> 获得开始统计时高精度运行计数器的数值 </summary>
/// <returns> 开始统计时高精度运行计数器的数值 </returns>
LONGLONG StartCount() const
{
return m_llStartCount;
}
/// <summary> 获得结束统计时高精度运行计数器的数值 </summary>
/// <returns> 结束统计时高精度运行计数器的数值 </returns>
LONGLONG EndCount() const
{
return m_llEndCount;
}
/// <summary> 获得代码运行时间 </summary>
/// <returns> 代码运行时间(单位:s) </returns>
long double DiffSeconds() const
{
return m_ldDiffSeconds;
}
/// <summary> 获得代码运行时间 </summary>
/// <returns> 代码运行时间(字符串格式) </returns>
const std::string& DiffTime() const
{
return m_strDiffTime;
}
private:
BOOL m_bSupported; // 是否支持高精度运行计数器
LONGLONG m_llFrequency; // 高精度运行计数器的频率(单位:n/s)
LONGLONG m_llStartCount; // 开始统计时高精度运行计数器的数值
LONGLONG m_llEndCount; // 结束统计时高精度运行计数器的数值
long double m_ldDiffSeconds; // 代码运行时间(单位:s)
std::string m_strDiffTime; // 字符串格式的代码运行时间
};
#endif //PERFORMTIME_H
示例:
Code:
int main(int argc, char* argv[])
{
CPerformTime pt;
pt.Start();
long ert = 10000;
while (ert--)
;
pt.Finish();
cout << "The frequency of the high-resolution performance counter is " << (long)pt.Frequency() << "/s.\n";
cout << "The diff-count is " << (long)(pt.EndCount() - pt.StartCount()) << ".\n";
cout << "The performance experienced " << pt.DiffTime() << "(total " << pt.DiffSeconds() << "s).\n\n";
return 0;
}
输出:
The frequency of the high-resolution performance counter is 3579545/s.
The diff-count is 434.
The performance experienced 0 hours 0 minutes and 0.000121244 seconds(total 0.000121244s).
精度:
约1/3微秒(3.33e-7秒)甚至更高。