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