zoukankan      html  css  js  c++  java
  • 转: 计算程序运行时间的方法

    这个是windows里面常用来计算程序运行时间的函数;
    DWORD dwStart = GetTickCount();
    //这里运行你的程序代码
    DWORD dwEnd = GetTickCount();
    则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
    这个函数只精确到55ms,1个tick就是55ms。

    #include <iostream>
    #include <windows.h>
    using namespace std;
    int main(int argc, char* argv[])
    {
    DWORD start, end;

    start = GetTickCount();
    for(int i=0;i<1000;i++)
    cout<<"you are a good child!"<<endl;   //your code
    end = GetTickCount()-start;
    cout<<end<<endl;
        return 0;
    }

    2
    timeGetTime()基本等于GetTickCount(),但是精度更高
    DWORD dwStart = timeGetTime();

    //这里运行你的程序代码

    DWORD dwEnd = timeGetTime();

    则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位
    虽然返回的值单位应该是ms,但传说精度只有10ms。

    #include <iostream>
    #include <windows.h>
    #pragma comment(lib,"winmm.lib")

    using namespace std;
    int main(int argc, char* argv[])
    {
    DWORD start, end;

    start = timeGetTime();
    for(int i=0;i<100;i++)
    cout<<"you are a good child!"<<endl;
    end = timeGetTime()-start;
    cout<<end<<endl;
        return 0;
    }

    3
    用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。
    clock_t clock ( void );

    #include <time.h>
    clock_t t = clock();
    long sec = t / CLOCKS_PER_SEC;
    他是记录时钟周期的,实现看来不会很精确,需要试验验证;

    4
    #include<iostream>
    #include<ctime> //<time.h>
    using   namespace   std;
    int   main()
    {
        time_t   begin,end;

        double duration;
        begin=clock();
        //这里加上你的代码
        end=clock();

        duration=double(end-begin)/CLOCKS_PER_SEC;
        cout<<"runtime:   "<<duration<<endl;
    }

    5
    unix时间相关,也是标准库的
    这些在<time.h>
    1.timegm函数只是将struct tm结构转成time_t结构,不使用时区信息;
    time_t timegm(struct tm *tm);

    2.mktime使用时区信息
    time_t mktime(struct tm *tm);

    timelocal 函数是GNU扩展的与posix函数mktime相当
    time_t timelocal (struct tm *tm);

    3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息;
    struct tm * gmtime(const time_t *clock);

    4.localtime使用时区信息
    struct tm * localtime(const time_t *clock);

    1.time获取时间,stime设置时间
    time_t t;
    t = time(&t);
    2.stime其参数应该是GMT时间,根据本地时区设置为本地时间;
    int stime(time_t *tp)

    3.UTC=true 表示采用夏时制;
    4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间;
    5.设置时区推荐使用setup来设置;
    6.设置时区也可以先更变/etc/sysconfig/clock中的设置 再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效

    time_t只能表示68年的范围,即mktime只能返回1970-2038这一段范围的time_t
    看看你的系统是否有time_t64,它能表示更大的时间范围


    Window里面的一些不一样的

    CTime MFC类,好像就是把time.h封了个类,没扩展
    CTime t = GetCurrentTime();

    SYSTEMTIME 结构包含毫秒信息
    typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
    } SYSTEMTIME, *PSYSTEMTIME;

    SYSTEMTIME t1;
    GetSystemTime(&t1)
    CTime curTime(t1);
    WORD ms = t1.wMilliseconds;

    SYSTEMTIME sysTm;
    ::GetLocalTime(&sysTm);


    在time.h中的_strtime() //只能在windows中用
    char t[11];
    _strtime(t);
    puts(t);

    6
    下面是转的一个用汇编的精确计时方法
    ---------------------------------------------------------------------------------------
    如何获得程序或者一段代码运行的时间?你可能说有专门的程序测试工具,确实,不过你也可以在程序中嵌入汇编代码来实现。

    在Pentium的指令系统中有一条指令可以获得CPU内部64位计数器的值,我们可以通过代码两次获取该计数器的值而获得程序或代码运行的时钟周期数,进而通过你的cpu的频率算出一个时钟周期的时间,从而算出程序运行的确切时间。

    我们通过指令TDSIC来获得cpu内部计数器的值,指令TDSIC返回值放在EDX:EAX中,其中EDX中存放64位寄存器中高32位的值,EAX存放第32位的值.

    下面看看实现的代码:

    //用汇编实现获取一段代码运行的时间
    #include<iostream>

    using namespace std;

    void GetClockNumber (long high, long low);
    void GetRunTime();

    int main()
    {  

    long HighStart,LowStart,HighEnd,LowEnd;
    long numhigh,numlow;
    //获取代码运行开始时cpu内部计数器的值
    __asm      
    {
    RDTSC
    mov HighStart, edx
    mov LowStart, eax
    }
    for(int i= 0; i<100000; i++ )
    {
           for(int i= 0; i<100000; i++ )
       {
      
       }

    }
    //获取代码结束时cpu内部计数器的值,并减去初值
        __asm
    {
    RDTSC
    mov HighEnd, edx
    Mov LowEnd, eax
    ;获取两次计数器值得差
    sub eax, LowStart
    cmp eax, 0    ; 如果低32的差为负则求返,因为第二次取得永远比第一次的大
    jg   L1
    neg   eax
    jmp   L2
          L1: mov numlow, eax
          L2: sbb edx, HighStart
    mov numhigh, edx

    }
        //把两个计数器值之差放在一个64位的整形变量中
        //先把高32位左移32位放在64的整形变量中,然后再加上低32位
    __int64 timer =(numhigh<<32) + numlow;
         //输出代码段运行的时钟周期数
         //以频率1.1Gcpu为例,如果换计算机把其中的1.1改乘其它即可,因为相信大家的cpu都应该在1G以上 ^_^
    cout<< (double) (timer /1.1/1000000000) << endl;
    return 0;
    }


       这样通过一条简单的汇编指令就可以获得程序或一段代码的大概时间,不过并不能得到运行的确切时间,因为即使去掉中间的循环,程序也会有个运行时间,

    因为在第一次取得计数器的值后,有两条汇编指令mov HighStart, edx    mov LowStart, eax这两条指令当然也有运行时间 ,当然你可以减去这两条指令的运行时间(在1.1G的机子上是3e-8s),这样会更精确一点。

    如果你要确切知道程序的运行时间,测试软件肯定会更好一点,不过好像一般没有必要获取除非专门的要求的程序。

    不过能DIY一个也是不错的,不管有没有,最起码你可以学到在VC++中如何嵌入汇编代码以及如何使用32位的寄存器,其实和16位的寄存器一样使用,将来64的也应该一样,只不过位数不同罢了

     专业的作者“brucema的博客”

  • 相关阅读:
    dynamic_cast
    struct 字节对齐详解
    CentOS修改系统的默认启动模式为命令号界面
    linux系统备份还原
    linux 缺少libxxx.a 静态链接库
    linux下SVN忽略文件/文件夹的方法
    取消svn add
    centos 中文乱码解决办法2
    安装rpm包时遇到error: Failed dependencies:错误
    Linux rpm 命令参数使用详解[介绍和应用]
  • 原文地址:https://www.cnblogs.com/gdutbean/p/2206785.html
Copyright © 2011-2022 走看看