快速业务通道

C++高精度定时器

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

//////////////////////////////////////////////////////////////////////// ///////
// 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);
    }
};

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号