中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > .NET > 临时文章
定义并实现统计代码执行时间的类
作者:未知 时间:2005-07-27 21:30 出处:CSDN 责编:chinaitpower
              摘要:定义并实现统计代码执行时间的类

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


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有