zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    http协议基础(三)几种数据传输方式
    http协议基础(二)请求和响应报文的构成
    http协议(一)基础知识
    性能测试常见术语浅析
    TPS和QPS定义以及影响TPS的因素
    JMeterPlugin性能监控
    jmeter压测之 监控--nmon
    对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
    C# AES的128位、192位、256位加密
    C# 处理base64 以及base64的原理分析
  • 原文地址:https://www.cnblogs.com/hustcat/p/1506674.html
Copyright © 2011-2022 走看看