当前位置:主页   - 电脑 - 程序设计 - C/C++
C++高精度定时器
来源:网络   作者:   更新时间:2012-02-15
收藏此页】    【字号    】    【打印】    【关闭

///////////////////////////////////////////////////////////////////////////////
// KTimer.h
//
//      Windows Graphics Programming Win32 GDI and DirectDraw®
//      Feng Yuan 
//      Publisher: Prentice Hall PTR 
//      First Edition December 01, 2000
//
//  高精度纳秒计时器, 最后修改:
//      2008-12  by cheungmine@gmail.com
///////////////////////////////////////////////////////////////////////////////
/* Usage:

    int main()
    {
        KTimer  kt;
        unsigned int cpu_speed = kt.CPUSpeedMHz();

        kt.Start();

        Sleep(1234);

        unsigned int elapsed_cyc = (unsigned int) kt.Stop();

        printf("CPU Speed: %.2f Ghz. Elapsed %ld CPU Cycles ( %ld Nanosecond)n", 
            cpu_speed/1000.f, 
            elapsed_cyc, 
            KTimer::CyclesToNanos(elapsed_cyc, cpu_speed));
    }
*/
#pragma once

#ifndef STRICT
#  define STRICT
#endif

#ifndef WIN32_LEAN_AND_MEAN
#  define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>

inline unsigned __int64 GetCycleCount(void)
{
    _asm    _emit 0x0F
    _asm    _emit 0x31
}

class KTimer
{
    unsigned __int64  m_startcycle;

public:

    unsigned __int64  m_overhead;   // Clock Cycles

    KTimer(void)
    {
        m_overhead = 0;
        Start();
        m_overhead = Stop();
    }

    // 启动CPU时钟
    void Start(void)
    {
        m_startcycle = GetCycleCount();
    }

    // 停止CPU时钟, 返回自上一次启动的时钟周期数
    unsigned __int64 Stop(void)
    {
        return GetCycleCount()-m_startcycle-m_overhead;
    }

    // 把以CPU周期数转为纳秒
    unsigned __int64 static CyclesToNanos(unsigned __int64 time_cycles, unsigned int speed_mhz)
    {
        return time_cycles*1000 / speed_mhz;
    }
    
    // 把以CPU周期数转为毫秒
    unsigned __int64 static CyclesToMillis(unsigned __int64 time_cycles, unsigned int speed_mhz)
    {
        return time_cycles / speed_mhz / 1000;
    }

    // 1GHz = 1000MHz
    unsigned int CPUSpeedMHz()
    {
        Start();
        Sleep(1000);
        unsigned __int64 cputime = Stop();
        
        return (unsigned int)(cputime/1000000);
    }   
};

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明