• 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;
    }

  • 相关阅读:
    Nagios显示器mysql定从库: libmysqlclient.so.18: cannot open shared object file: No such
    UVA 11402
    Oracle 11g 的PL/SQL函数结果缓存
    最大公约数(Greatest Common Divisor)
    计时器 Timer
    ArcGIS Engine 捕捉
    AE+C# 图层中增加相应属性标注
    C# ComboBox自动完成功能的示例
    Visual Assist的破解与安装
    GitHub的代码托管和使用方法
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3675848.html
Copyright © 2020-2023  润新知