• IA32周期计数器


    IA32处理器包含一个运行在时针周期级的计时器,这个计时器是一个特殊的寄存器,每个时钟周期它都会加1。IA32并提供特殊的指令读取该计时器,利用该计时器,可以很容易的计算出CPU的时钟周期(频率)。

     程序如下:

    #include <windows.h>
    //#include <stdlib.h>
    #include <stdio.h>

    static unsigned cyc_hi = 0;
    static unsigned cyc_lo = 0;
    /*寄存器使用惯例:
    **eax,ecx,edx由调用者保存,ebx,esi,edi由被调用者保存
    */
    //vc下的嵌入汇编
    void access_counter(unsigned *hi, unsigned *lo)
    {
        _asm{
            rdtsc
            mov ecx,hi
            mov dword ptr[ecx],edx
            mov ecx,lo
            mov dword ptr[ecx],eax
        }
    }
    //gcc的嵌入汇编
    // void access_counter(unsigned *hi, unsigned *lo)
    // {
    //     asm("rdtsc; movl %%edx,%0; movl %%eax,%1"   /* Read cycle counter */
    //         : "=r" (*hi), "=r" (*lo)                /* and move results to */
    //         : /* No input */                        /* the two outputs */
    //     : "%edx", "%eax");
    // }

    /* Record the current value of the cycle counter. */
    void start_counter()
    {
        access_counter(
    &cyc_hi, &cyc_lo);
    }

    /* Return the number of cycles since the last call to start_counter. */
    double get_counter()
    {
        unsigned ncyc_hi, ncyc_lo;
        unsigned hi, lo, borrow;
        
    double result;
        
        
    /* Get cycle counter */
        access_counter(
    &ncyc_hi, &ncyc_lo);
        
        
    /* Do double precision subtraction */
        lo 
    = ncyc_lo - cyc_lo;
        borrow 
    = cyc_lo > ncyc_lo;
        hi 
    = ncyc_hi - cyc_hi - borrow;
        result 
    = (double) hi * (1 << 30* 4 + lo;
        
    return result;
    }

    /* $begin mhz */
    /* Estimate the clock rate by measuring the cycles that elapse */ 
    /* while sleeping for sleeptime seconds */
    double mhz(int verbose, int sleeptime)
    {
        
    double rate;
        
        start_counter();
        
    //c库的sleep函数以秒为单位
        
    //sleep(sleeptime);
        
    //win32 API的Sleep以毫秒为单位
        Sleep(sleeptime);
        
    //linux
        
    //rate = get_counter() / (1e6*sleeptime);

        
    //windows
        rate = get_counter() / (1e3*sleeptime);

        
    if (verbose) 
            printf(
    "Processor clock rate ~= %.1f MHz\n", rate);
        
    return rate;
    }
    int main()
    {
        
    int i;
        
    for (i=0;i<10;i++)
        {
            
    //线程睡眠1秒
            
    //mhz(1,1);  //linux下
            
    //windows下
            mhz(1,1000); 
        }
        
    return 0;
    }

     windows下输出:

     

    Linux下输出:

     

    本机的处理器为:Pentium(R) 4 CPU 1.60GHz

  • 相关阅读:
    转 sql 时间转换格式 convert(varchar(10),字段名,转换格式)
    C#页面添加提交数据后跳出小弹窗的功能
    解决粘包问题
    粘包问题
    模拟ssh远程执行命令
    基于TCP协议的socket套接字编程
    Linux和git使用
    osi七层协议
    TCP协议的三次握手和四次挥手
    C/S 和 B/S架构
  • 原文地址:https://www.cnblogs.com/hustcat/p/1506674.html
Copyright © 2020-2023  润新知