zoukankan      html  css  js  c++  java
  • windows 关于时间的计算

    这几天看了编程之美的前几页,介绍了一些关于时间的函数

    1、CTime:在CTime获取当前的时间,一般用CTime tm = CTime::GetCurrentTime();来获取当前的时间。然后通过tm 可以读取到各种各样的时间。如果想计算两个时间段之间的时间差,可以使用 CTimeSpan span = end - tm;  获取到从tm 到end 之间的时间。可以通过span 获取到这段时间经历的秒数,等等。span.GetTotalSeconds()

    2、clock:

    // time(NULL) 返回的是精确到秒数的时间
    // clock() 返回的是精确到毫秒的时间 其实返回的是程序运行到现在的时间
    // time() GetSystemTimeAsFileTime 返回的是以100纳秒为单位的,从1601年1月1日到现在的总时间和,u64
    // 这里time(param) 里面的param 参数是可以自己看是否需要放置,不要可以放置为空。
    clock_t start, finish;
    long i = 1000000000;
    start = clock();
    clock_t startClock, finishClock;
    startClock = time(NULL);
    while (i--);
    finish = clock();
    finishClock = time(NULL);
    double dration = (finish - start)*1.0 / CLOCKS_PER_SEC;
    std::cout << dration << std::endl;

    dration = difftime(finishClock, startClock); // 返回的是两个时间的相减(前减后) 底层是64位相减,返回强转成double型的

    3、GetTickCount() 、time(NULL)、mktime()

    struct tm *local;
    time_t t;
    t = time(NULL); // 获取当前系统的时间返回的是从1900年到现在的秒数

    std::cout << ctime(&t) << std::endl;
    local = localtime(&t); // 通过t获取的时间,转换成tm 的结构体的格式 这里直接转换成了指针
    std::cout << local->tm_sec << std::endl;
    std::cout << ctime(&t) << std::endl; // 转换成固定格式的时间

    struct tm newTime;
    memset(&newTime, 0, sizeof(newTime));
    newTime.tm_year = 1991 - 1900; // 一般情况下都是从1900年开始计算的数值
    newTime.tm_mon = 9;
    newTime.tm_mday = 22;
    time_t tt = mktime(&newTime); // tt 是从1900年开始计算的一个数据,到现在的秒数
    std::cout << ctime(&tt) << std::endl; // 将时间的转换成对应的标准的时间字符串

    DWORD dwStart = GetTickCount(); // 返回从开机到现在的时间,精确到毫秒
    Sleep(100);
    DWORD dwEnd = GetTickCount();
    std::cout << difftime(dwEnd, dwStart) << std::endl;

    4、QueryPerformanceFrequency、QueryPerformanceCounter

    // 该方法是一种重量级的计算,可以计算非常准确的时间。一般情况下,到毫秒级别的,只需要使用clock即可
    LARGE_INTEGER frequency;
    QueryPerformanceFrequency(&frequency); // 返回每秒,cpu 所使用的时钟数
    LARGE_INTEGER timeStart, timeEnd;
    QueryPerformanceCounter(&timeStart);
    Sleep(100);
    QueryPerformanceCounter(&timeEnd);
    std::cout << difftime(timeEnd.QuadPart, timeStart.QuadPart)* 1000/frequency.QuadPart << std::endl;

    5、timeGetTime  也是精确到毫秒级别的时间函数,但是该函数只是一个轻量级的时间函数

    //  需要 #pragma comment(lib, "winmm.lib")

    DWORD dw = timeGetTime();
    std::cout << dw << std::endl;
    Sleep(120);
    DWORD dwEnd = timeGetTime();
    std::cout << difftime(dwEnd, dw) << std::endl;  // 我的电脑显示的是121

    6、GetLocalTime;GetSystemTime

    SYSTEMTIME sysTime;
    GetLocalTime(&sysTime); // 返回的是本地时间
    std::cout << sysTime.wYear << " " << sysTime.wMonth << " " << sysTime.wDay << std::endl;
    GetSystemTime(&sysTime); // 返回的是utc时间
    std::cout << sysTime.wYear << " " << sysTime.wMonth << " " << sysTime.wDay << std::endl;

    这两个函数在使用上,一般是使用GetLocalTime函数。获取的是当地的时间。 而System则获取的是标准的时间

    7、CallNtPowerInformation 该函数在使用上面呢,确实有点坑,我现在测试上,还是很头痛,怎么测,老是跟我的期待值差好大

    timeGetSystemTime 

    inline __int64 GetCPUTickCount()
    {
    __asm
    {
    rdtsc;
    }
    }


    #include <powrprof.h>
    #pragma comment(lib, "PowrProf.lib")
    typedef struct _PROCESSOR_POWER_INFORMATION { ULONG Number; ULONG MaxMhz; ULONG CurrentMhz; ULONG MhzLimit; ULONG MaxIdleState; ULONG CurrentIdleState;
    } PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;

    void OperateOtherTime()
    {
    MMTIME myTimeStart, myTimeEnd;
    MMRESULT result1 = timeGetSystemTime(&myTimeStart, sizeof(myTimeStart));
    Sleep(50);
    MMRESULT result2 = timeGetSystemTime(&myTimeEnd, sizeof(myTimeEnd));
    std::cout << difftime(myTimeEnd.u.ms, myTimeStart.u.ms) <<"ms" << std::endl;
    DWORD_PTR ptr = SetThreadAffinityMask(GetCurrentThread(), 1);
    PROCESSOR_POWER_INFORMATION info;

    CallNtPowerInformation((POWER_INFORMATION_LEVEL)11, NULL, 0, &info, sizeof(info)); // 根据不同的level定义不同结构体

    __int64 t_begin = __rdtsc();
    Sleep(500);
    __int64 t_end = GetCPUTickCount(); // 这个函数跟上面的__rdtsc()函数的使用时一样的
    double millisec = ((double)t_end - (double)t_begin)*1000/(double)info.CurrentMhz;

    std::cout << millisec << std::endl;
    }

  • 相关阅读:
    ORA-12801/ORA-12853: insufficient memory for PX buffers: current 274880K, max needed 19722240K/ORA-04031解决方法
    关于oracle result_cache
    oracle insert、append、parallel、随后查询的redo与磁盘读写
    关于ashrpt中行源的CPU + Wait for CPU事件深入解读
    resmgr:cpu quantum 等待事件 top 1
    ORA-00600: internal error code, arguments: [kcblin_3], [103], [253952], [8192], [32769], [312], [640], [], [], [], [], []解决方法
    Oracle之with as和update用法
    oracle查询buffer cache中undo大小
    oracle group by placement可能导致错误结果的bug
    maven maven-war-plugin 解决java war项目间的依赖(两个war都可独立部署运行,maven 3.2.x亲测)
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3675848.html
Copyright © 2011-2022 走看看