博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows 关于时间的计算
阅读量:5022 次
发布时间:2019-06-12

本文共 3698 字,大约阅读时间需要 12 分钟。

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

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;

}

转载于:https://www.cnblogs.com/cxiaoln/p/3675848.html

你可能感兴趣的文章
js 原生 ajax
查看>>
关键词 virtual
查看>>
建造者模式(屌丝专用)
查看>>
UVALive 4730 Kingdom +段树和支票托收
查看>>
[APIO2010]特别行动队
查看>>
[SCOI2016]幸运数字
查看>>
SpringBoot 集成ehcache
查看>>
初步swift语言学习笔记2(可选类型?和隐式可选类型!)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>
在Macos下完美解决Adobe Dreamweaver CC 2018 汉化及操作方法
查看>>
【转】 Newtonsoft.Json高级用法
查看>>
CodeBlocks X64 SVN 编译版
查看>>
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
查看>>
bug记录_signalr执行$.connnection.testhub结果为空
查看>>
【转】常用的latex宏包
查看>>
[TMS320C674x] 一、GPIO认识
查看>>
酷狗的皮肤文件存放在哪
查看>>
iOS RunLoop简介
查看>>
C++的引用
查看>>