在 C++ 中使用不同平台的时间函数及比较

       

 在 C++ 编程中,时间函数的选择对于性能测量、任务调度和时间戳记录至关重要。不同的操作系统提供了不同的时间函数,同时在同一个平台上,也可能有多种不同的时间函数可供选择。本文将介绍在 C++ 中常用的时间函数,并比较它们在不同平台上的应用和效果。

跨平台的时间函数:std::chrono

        随着 C++11 的引入,标准库提供了 std::chrono,这是一个现代化的时间库,具有高精度和跨平台的特性。它基于类型安全和模板化的设计,使得时间的测量和计算变得更加简单和可靠。        

#include <iostream>
#include <chrono>
#include <thread>int main() {// 获取当前时间点auto start = std::chrono::high_resolution_clock::now();// 模拟工作(例如,暂停 1 秒)std::this_thread::sleep_for(std::chrono::seconds(1));// 获取当前时间点auto end = std::chrono::high_resolution_clock::now();// 计算持续时间std::chrono::duration<double> duration = end - start;std::cout << "Duration: " << duration.count() << " seconds\n";return 0;
}

        在这个示例中,std::chrono::high_resolution_clock 提供了高分辨率的时间点,std::chrono::duration<double> 用于表示时间间隔。这些功能在大多数现代操作系统上都可用,因此非常适合跨平台开发。

Windows 平台的时间函数

        在 Windows 上,有几种常用的时间函数,适合不同的时间需求。

GetSystemTime 和 GetLocalTime

        这些函数提供了系统时间和本地时间的访问:

#include <iostream>
#include <windows.h>int main() {SYSTEMTIME st;GetSystemTime(&st); // 获取系统时间(UTC 时间)std::cout << "System Time (UTC): " << st.wYear << "-"<< st.wMonth << "-"<< st.wDay << " "<< st.wHour << ":"<< st.wMinute << ":"<< st.wSecond << "."<< st.wMilliseconds << "\n";GetLocalTime(&st); // 获取本地时间std::cout << "Local Time: " << st.wYear << "-"<< st.wMonth << "-"<< st.wDay << " "<< st.wHour << ":"<< st.wMinute << ":"<< st.wSecond << "."<< st.wMilliseconds << "\n";return 0;
}

QueryPerformanceCounter

        这是一个高精度的计时器,适合精确测量时间间隔:

#include <iostream>
#include <windows.h>int main() {LARGE_INTEGER frequency;LARGE_INTEGER start, end;// 获取高精度计时器的频率QueryPerformanceFrequency(&frequency);// 获取开始时间QueryPerformanceCounter(&start);// 模拟工作(例如,暂停 1 秒)Sleep(1000);// 获取结束时间QueryPerformanceCounter(&end);// 计算持续时间double duration = static_cast<double>(end.QuadPart - start.QuadPart) / frequency.QuadPart;std::cout << "High-resolution duration: " << duration << " seconds\n";return 0;
}

Unix/Linux 平台的时间函数

        在 Unix/Linux 系统上,也有多种时间函数可供选择。

gettimeofday

        这是一个高分辨率的计时函数,返回自 Epoch 以来的秒数和微秒数:

#include <iostream>
#include <sys/time.h>int main() {struct timeval tv;gettimeofday(&tv, nullptr);std::cout << "Seconds: " << tv.tv_sec << "\n";std::cout << "Microseconds: " << tv.tv_usec << "\n";return 0;
}

clock_gettime

        提供了更高的精度,并支持多种时间类型:

#include <iostream>
#include <ctime>int main() {struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);std::cout << "Seconds: " << ts.tv_sec << "\n";std::cout << "Nanoseconds: " << ts.tv_nsec << "\n";return 0;
}

相同平台的不同时间函数对比

        即使在同一个操作系统上,也可能有多个不同的时间函数可供选择。例如,Windows 上的 GetSystemTime 提供了系统时间,而 QueryPerformanceCounter 则提供了高精度的计时器功能。在 Unix/Linux 上,gettimeofdayclock_gettime 分别提供了不同精度和用途的时间测量。

使用跨平台库

        除了原生的操作系统时间函数外,还可以考虑使用跨平台的第三方库,如 Boost 库中的时间模块。Boost.Chrono 提供了与 std::chrono 类似的功能,同时保持了更好的兼容性和可移植性。

#include <iostream>
#include <boost/chrono.hpp>int main() {boost::chrono::high_resolution_clock::time_point start = boost::chrono::high_resolution_clock::now();// 模拟工作boost::this_thread::sleep_for(boost::chrono::seconds(1));boost::chrono::high_resolution_clock::time_point end = boost::chrono::high_resolution_clock::now();boost::chrono::duration<double> duration = end - start;std::cout << "Duration: " << duration.count() << " seconds\n";return 0;
}

结论

        选择合适的时间函数取决于你的应用程序需求,如精度、平台兼容性和功能特性。在现代 C++ 中,std::chrono 提供了一个强大的跨平台时间库,推荐用于大多数时间测量和计时任务。而对于特定平台或需要更高精度的情况,可以考虑使用操作系统提供的特定时间函数或第三方库进行扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通俗范畴论2 有向图与准范畴

退一步海阔天空&#xff0c;在正式进入范畴论之前&#xff0c;我们可以重新审视一下我们是如何认识世界的&#xff0c;有了这个对人类认识世界过程的底层理解&#xff0c;可以帮助我们更好地理解范畴论。 对于人类认识世界&#xff0c;最神奇的一点就是这个世界居然是可以认识…

Elasticsearch 认证模拟题 - 22

一、题目 索引 task 索引中文档的 fielda 字段内容包括了 hello & world&#xff0c;索引后&#xff0c;要求使用 match_phrase query 查询 hello & world 或者 hello and world 都能匹配该文档 1.1 考点 分词器 1.2 答案 # 创建符合条件的 task 索引&#xff0c;…

算法人生(22):从“生成对抗网络”看“逆商提升”

​ 在图像生成与编辑、音频合成、视频生成领域里&#xff0c;有一个非常重要的深度学习方法——生成对抗网络&#xff08;简称GANs&#xff09;&#xff0c;它是由两个神经网络组成的模型&#xff0c;分别为生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discr…

采煤vr事故灾害应急模拟救援训练降低生命财产损失

在化工工地&#xff0c;设备繁多、环境复杂&#xff0c;潜藏着众多安全隐患&#xff0c;稍有不慎便可能引发安全事故。为了保障工地的安全&#xff0c;我们急需一套全面、高效的安全管理解决方案。web3d开发公司深圳华锐视点研发的工地安全3D模拟仿真隐患排查系统&#xff0c;正…

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类?

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类&#xff1f; 制作耳机壳的胶粘剂有很多种类&#xff0c;常见的有环氧树脂胶水、UV树脂胶、快干胶、热熔胶等。 这些胶粘剂都有不同的特点和适用场景&#xff0c;可以根据自己的需求选择合适的类型。 例如&#xff1a; 环氧树脂…

pdf转图片,pdf转图片在线转

pdf转图片的方法&#xff0c;对于许多人来说可能是一个稍显陌生的操作。然而&#xff0c;在日常生活和工作中&#xff0c;我们有时确实需要将pdf文件转换为图片格式&#xff0c;以便于在特定的场合或平台上进行分享、展示或编辑。以下&#xff0c;我们将详细介绍一个pdf转成图片…

用宝塔部署vue+springboot上线公网详细步骤

首先自己在腾讯云中按照教程安装好宝塔。这是宝塔面板&#xff0c;获取登录宝塔的网址和账号密码。 1.在navicat新建数据库 如果出现权限问题&#xff0c;可以在宝塔数据库面板phpMyAdmin中进行权限设置 navicat可以修改用户权限 2.在宝塔面板新建数据库 3.将前端打包的dist文件…

linux 部署瑞数6实战(维普,药监局)第一部分

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx 本文章未经许可禁止转载&…

【星海随笔】云解决方案学习日志篇(二) kafka、Zookeeper、Fielbeat

Elastic 中国社区官方博客 https://blog.csdn.net/ubuntutouch/category_9209092.html Kafka kafka的源代码是基于Scala语言编写的&#xff0c;运行在Java虚拟机&#xff08;即:JVM&#xff09;上。因此&#xff0c;在安装kafka之前需要先安装JDK Kafka 为什么依赖 Zookeepe…

52. QT插件开发--插件程序(带ui文件)的创建与编译

1. 说明 一般情况下,针对代码量比较小的QT程序不需要进行插件集成化开发,但是针对大型程序来说,代码结构比较复杂,使用插件开发的方式可以提高代码开发和维护效率,团队之间的分工合作也会更加的明确。所谓插件式开发,实际上就是把程序的一部分功能封装起来,编译成一个单…

认识Redis 主从同步、事务和Memcached的区别

08- 什么是 Redis 主从同步&#xff1f; Redis 的主从同步(replication)机制&#xff0c;允许 Slave 从 Master 那里&#xff0c;通过网络传输拷贝到完整的数据备份&#xff0c;从而达到主从机制。 主数据库可以进行读写操作&#xff0c;当发生写操作的时候自动将数据同步到从…

AES加密、DES加密和RC4加密的区别

AES加密、DES加密和RC4加密在多个方面存在显著区别。以下是这些加密算法的详细对比&#xff1a; AES加密 算法原理&#xff1a; AES&#xff08;Advanced Encryption Standard&#xff09;采用对称密钥加密&#xff0c;利用分组密码的原理&#xff0c;将明文分成多个128位的组…

【C语言】解决C语言报错:Use of Uninitialized Variable

文章目录 简介什么是Use of Uninitialized VariableUse of Uninitialized Variable的常见原因如何检测和调试Use of Uninitialized Variable解决Use of Uninitialized Variable的最佳实践详细实例解析示例1&#xff1a;局部变量未初始化示例2&#xff1a;数组未初始化示例3&…

分布式物联网平台特点

随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;我们正步入一个万物互联的新时代。在这个时代&#xff0c;设备、数据和服务的无缝集成是实现智能化的关键。分布式物联网平台作为这一进程的核心&#xff0c;正在成为构建智能世界的基石。 一、分布式物联网平…

C++ 47 之 函数调用运算符重载

#include <iostream> #include <string> using namespace std;class MyPrint{ public:// 重载小括号() 重载谁operator后就紧跟谁的符号void operator()(string txt){cout << txt << endl;} };class MyAdd{ public:int operator()(int a, int b){retur…

【Pandas驯化-04】Pandas中drop_duplicates、describe、翻转操作

【Pandas驯化-04】Pandas中drop_duplicates、describe、翻转操作 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公…

CleanMyMac X软件下载附加详细安装教程

​首先要介绍的是CleanMyMac X&#xff0c;这是一款极受欢迎的苹果电脑清理软件&#xff0c;它能够全面扫描你的电脑系统&#xff0c;清理无用的文件和垃圾&#xff0c;以释放硬盘空间&#xff0c;除了清理功能之外&#xff0c;CleanMyMac X 还可协助管理应用程序、优化性能、修…

[2024-06]-[大模型]-[Ollama]- WebUI

主要涉及要部署的前端webui是来源于:https://github.com/open-webui/open-webui 正常就使用: docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-web…

建造者模式(大话设计模式)C/C++版本

建造者模式 C 参考&#xff1a;https://www.cnblogs.com/Galesaur-wcy/p/15907863.html #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std;// Product Class&#xff0c;产品类&#xff0c;由多个…

小白跟做江科大32单片机之定时器输出比较

原理部分 背景 GPIO口是数字输出端口&#xff0c;只能输出1和0。但是通过PWM&#xff0c;可以使其控制LED呼吸灯亮灭的程度 1.通过CNT和CCR进行比较&#xff0c;可以输出一定频率和占空比的PWM波形 2.通用定时器有4个CCR&#xff0c;可同时输出4路PWM波形&#xff0c;但只有…