这几天看了编程之美的前几页,介绍了一些关于时间的函数
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;
}