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

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

/// <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秒)甚至更高。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航