C++高精度计时方法总结(测试函数运行时间)

文章目录

    • 一、clock()函数——毫妙级
    • 二、GetTickCount()函数(精度16ms左右)——毫妙级
    • 三、高精度时控函数QueryPerformanceCounter()——微妙级
    • 四、高精度计时chrono函数——纳妙级
    • 五、几种计时比较
    • 六、linux下的计时函数gettimeofday()-未测试
    • 参考文献

一、clock()函数——毫妙级

C系统调用方法,所需头文件ctime/time.h,即windows和linux都可以使用。

1、clock()返回类型为clock_t类型
2、clock_t实际为long 类型, typedef long clock_t
3、clock() 函数,返回从 开启这个程序进程 到 程序中调用clock()函数 时之间的CPU时钟计时单元(clock tick)数(挂钟时间),返回单位是毫秒
4、可以用常量CLOCKS_PER_SEC, 这个常量表示每一秒(per second)有多少个时钟计时单元

#include <time.h>   //引入头文件
void time1()
{clock_t start, end;start = clock();fun();  //需计时的函数end = clock();  cout << "elapsed time in clock = " << double(end - start) << "ms" << endl;  
}

二、GetTickCount()函数(精度16ms左右)——毫妙级

GetTickCount()是一个Windows API,所需头文件为<windows.h>。是通过计算从函数开始运行计时,直到函数运行结束所求出函数的运行时间。它返回从操作系统启动所经过的毫秒数,

此处需要注意的是,这个函数所求的的运行时间并非准确运行时间,不过相对来说比较准确,它的精度和CPU有关,一般精度在16ms左右,由于GetTickCount()返回值以32位的双字类型DWORD存储,所以它的存储最大值是(2^32-1) ms约为49.71天,一旦一个程序运行时间超过这个值,这个数字就会归为0。

#include <windows.h>   //引入头文件
void time2()
{DWORD t1, t2;t1 = GetTickCount();fun();  //需计时的函数t2 = GetTickCount();cout << "elapsed time in GetTickCount = " << double(t2 - t1) << "ms" << endl;
}

三、高精度时控函数QueryPerformanceCounter()——微妙级

原理:
这里使用高精度时控函数QueryPerformanceFrequency(),QueryPerformanceCounter()
它们是两个精度很高的函数,精度单位为微秒。使用QueryPerformanceCounter()即可获取这个高精度计时器的值,但是由于机器的原因,它们实际上的精度会大幅度受到机器运作的影响,则必须向系统查询它们确切的运作频率QueryPerformanceFrequency()函数提供了这个功能,可以通过这一个函数来获取高精度计时器的运作频率(在一秒钟之内它的运作次数),用两次调用QueryPerformanceCounter()函数的结果做差除以QueryPerformanceFrequency()的运作频率即可求出在两次“时间获取”之间所经过的时间。在其中放入想要测量时间的算法代码,就可以得知算法的运行时长。

精度: 计算机获取硬件支持,精度比较高,可以通过它判断其他时间函数的精度范围。

//QueryPerformanceCounter()是一个Windows API,所需头文件为<windows.h>
#include <windows.h>   //引入头文件
void time3()
{LARGE_INTEGER t1, t2, tc;QueryPerformanceFrequency(&tc);QueryPerformanceCounter(&t1);fun();  //需计时的函数QueryPerformanceCounter(&t2);double time = (double)(t2.QuadPart - t1.QuadPart) / (double)tc.QuadPart;cout << "elapsed time in QuadPart = " << time * 1000 << "ms" << endl;
}

四、高精度计时chrono函数——纳妙级

C++11 中的 chrono 库提供了精度最高为纳秒级的计时接口。由于是标准库中提供的功能,所以可以很好地跨平台使用。

下面来看一段使用 chrono 进行高精度计时的示例代码:

#include <iostream>
#include <chrono>
void time4()
{// 计时开始时间点// chrone 中常用的时钟类:// 		- std::chrono::high_resolution_clock//   	- std::chrono::system_clock//      - std::chrono::steady_clock// 三种时钟类有一些区别,其中 high_resolution_clock 精度最高auto start = std::chrono::high_resolution_clock::now();// 要计时的代码段fun();  // 计时结束时间点auto end = std::chrono::high_resolution_clock::now();// 计算运行时间, 时间单位://      - std::chrono::seconds//      - std::chrono::milliseconds//      - std::chrono::microseconds//      - std::chrono::nanosecondsauto duration = std::chrono::duration_cast<std::chrono::microseconds> (end - start);// 输出时间(给定时间单位)cout << "elapsed time in chrono = " << duration.count()/1000.0 << "ms" << endl;
} 

其中,microseconds 表示微妙。除此之外,还有五种时间单位:hours, minutes, seconds, milliseconds, nanoseconds.

五、几种计时比较

#include <iostream>
#include <chrono>
#include <thread>
#include <time.h>
#include <windows.h>using namespace std;void fun()
{// 睡眠100msstd::this_thread::sleep_for(std::chrono::milliseconds(100));
}
void compareTime()
{LARGE_INTEGER t1, t2, tc;QueryPerformanceFrequency(&tc);clock_t start, end;DWORD t11, t12;start = clock();t11 = GetTickCount();QueryPerformanceCounter(&t1);auto start1 = std::chrono::high_resolution_clock::now();fun();  //需计时的函数end = clock();t12 = GetTickCount();QueryPerformanceCounter(&t2);auto end1 = std::chrono::high_resolution_clock::now();double time = (double)(t2.QuadPart - t1.QuadPart) / (double)tc.QuadPart;auto duration = std::chrono::duration_cast<std::chrono::microseconds> (end1 - start1);cout << "elapsed time in clock = " << double(end - start) << "ms" << endl;cout << "elapsed time in GetTickCount = " << double(t12 - t11) << "ms" << endl;cout << "elapsed time in QuadPart = " << time * 1000 << "ms" << endl;cout << "elapsed time in chrono = " << duration.count() / 1000.0 << "ms" << endl;
}

在这里插入图片描述

六、linux下的计时函数gettimeofday()-未测试

gettimeofday() linux环境下的计时函数,int gettimeofday ( struct timeval * tv , struct timezone * tz ),gettimeofday()会把目前的时间由tv所指的结构返回,当地时区的信息则放到tz所指的结构中.

//timeval结构定义为:
struct timeval{
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
//timezone 结构定义为:
struct timezone{
int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/
int tz_dsttime; /*日光节约时间的状态*/
};

这个函数获取从1970年1月1日到现在经过的时间和时区(UTC时间),(按照linux的官方文档,时区已经不再使用,正常应该传NULL)。

调用代码:

#include <sys/time.h>   //引入头文件
int main()
{struct timeval t1,t2;double timeuse;gettimeofday(&t1,NULL);fun();gettimeofday(&t2,NULL);timeuse = (t2.tv_sec - t1.tv_sec) + (double)(t2.tv_usec - t1.tv_usec)/1000000.0;cout<<"time = "<<timeuse<<endl;  //输出时间(单位:s)
}

参考文献

C++下四种常用的程序运行时间的计时方法总结
C++中几种测试程序运行时间的方法

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

typedef的用法

typedef只有一种用法&#xff0c;那就是&#xff1a; 1,代替各种类型或某类&#xff08;结构体&#xff09;成员。 比如下列代码&#xff1a; #include <iostream> #include <string> int main() {typedef int i;i e3;int f3;std::string t_or_f(ef)?"tru…

OpenAI的O1模型达到AGI二级,类人推理能力被提示危险,细思极恐!

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 今天让我们一起来聊聊最近科技圈的大新闻—…

利士策分享,家庭内耗:隐形的风暴,无声的侵蚀

利士策分享&#xff0c;家庭内耗&#xff1a;隐形的风暴&#xff0c;无声的侵蚀 在温馨的灯光下&#xff0c;家本应是我们心灵的港湾&#xff0c;是疲惫时最坚实的依靠。 然而&#xff0c;当家庭内部出现裂痕&#xff0c;无形的内耗便如同冬日里的寒风&#xff0c;悄无声息地…

SpringBoot 3.4.0还没来之前,又又又更新啦!SpringBoot 3.3.4版本依赖升级,性能与稳定性再提升!

为什么要使用SpringBoot在现代开发中&#xff0c;高效与灵活性是每个开发团队追求的核心目标。然而&#xff0c;如何在不牺牲灵活性的前提下&#xff0c;快速构建复杂的应用程序&#xff0c;常常成为开发者的难题。SpringBoot的出现&#xff0c;正是为了解决这个矛盾。它以“约…

Spring Boot技术在高校心理辅导系统中的应用研究

3 系统分析 3.1可行性分析 在进行可行性分析时&#xff0c;我们通常根据软件工程里方法&#xff0c;通过四个方面来进行分析&#xff0c;分别是技术、经济、操作和法律可行性。因此&#xff0c;在基于对目标系统的基本调查和研究后&#xff0c;对提出的基本方案进行可行性分析。…

【C++初阶】探索STL之——vector

【C初阶】探索STL之——vector 1.什么是vector2.vector的使用2.1 vector的定义2.2 vector iterator(迭代器)的使用2.3 vector空间问题2.4 vector的增删查改2.5 vector迭代器失效的问题2.5.1 vector常见迭代器失效的操作 3 动态二位数组 1.什么是vector vector其实就是一个可以…

GNU链接器(LD):设置入口点(ENTRY命令)的用法及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

3.5.2 __ipipe_init()之完成中断处理程序设置

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 原创不易&#xff0c;需要大家多多鼓励&#xff01;您的关注、点赞、收藏就是我的创作动力&#xff01; 3.5.2 __ipipe_init()之完成中断处理程序设置 __ipipe_init()最核心的就是__ipipe_enable_pipeline()&am…

Mybatis自定义TypeHandler,直接存储枚举类对象

在这篇文章中&#xff0c;我们已经知道如何使用枚举类直接接受前端的数字类型参数&#xff0c;省去了麻烦的转换。如果数据库需要保存枚举类的code&#xff0c;一般做法也是代码中手动转换&#xff0c;那么能不能通过某种机制&#xff0c;省去转换&#xff0c;达到代码中直接保…

PowerMill 2025简体中文版百度云资源分享下载

如大家所了解的&#xff0c;PowerMill是一款专业的CAM&#xff08;计算机辅助制造&#xff09;软件。主要用于加工行业&#xff0c;可以帮助用户进行高效、精准的加工工艺设计和数控编程&#xff0c;以达到生产部件的高精度和高质量。 对于初次接触的小伙伴来说&#xff0c;目…

k均值vs高斯混合模型

K均值&#xff08;K-means&#xff09;和高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09;是常用的聚类算法。 K均值是非概率模型&#xff0c;根据&#xff08;欧氏&#xff09;距离判断&#xff0c;类比最小距离分类器&#xff08;分类&#xff09;。高斯混…

240922-chromadb的基本使用

A. 基本使用 ChromaDB 是一个专门为向量数据库和嵌入查询优化的数据库。它可以与嵌入模型结合使用&#xff0c;存储和查询高维向量数据&#xff0c;通常用于大规模语义搜索、推荐系统等领域。 以下是使用 ChromaDB 的步骤&#xff1a; 1. 安装 ChromaDB 你可以通过 pip 安装…

96. UE5 GAS RPG 实现闪电链技能(一)

闪电链有一个施法的过程&#xff0c;就是在按键按下的过程&#xff0c;会在按下的过程一直持续造成伤害&#xff0c;一直等到条件不满足&#xff08;技能键位抬起&#xff0c;蓝量不足&#xff0c;被眩晕&#xff09;时&#xff0c;将结束技能&#xff0c;并退出技能状态。 所以…

【WSL迁移】将WSL2迁移到D盘

首先查看WSL状态&#xff1a;wsl -l -v 以压缩包的形式导出到其他盘。 wsl --export Ubuntu D:\Ubuntu_WSL\ubuntu.tar 注销原有的linux系统 wsl --unregister Ubuntu 导入系统到D盘 wsl --import Ubuntu D:\Ubuntu_WSL D:\Ubuntu_WSL\Ubuntu.tar 恢复默认用户 Ubuntu co…

如何保护您的机器学习模型

在计算机技术领域&#xff0c;很少有领域像人工智能(AI)和机器学习(ML)一样受到如此多的关注。这门学科位于计算机科学和数据分析的交叉点&#xff0c;已成为移动应用程序、语音助手、欺诈交易检测、图像识别、自动驾驶甚至医疗诊断不可或缺的一部分。 背景介绍由于机器学习模型…

数据结构与算法——Java实现 9.习题——删除链表倒数节点

目录 19. 删除链表的倒数第 N 个结点 方法1 通过链表长度直接删除 方法2 递归加入哨兵节点 ListNode 方法3 快慢指针法 苦难&#xff0c;区区挫折罢了&#xff0c;而我必定站在幸福的塔尖 —— 24.9.22 19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第…

预付费计量系统整体概念

1.预付费计量系统整体概念 A Payment Metering System is a collective infrastructure that supports the contractual relationship between a supplier of goods or services and a customer. It includes processes, functions, data elements, system entities (devices a…

鸿蒙 OS 开发零基础快速入门教程

视频课程: 东西比较多, 这里主要分享一些代码和案例. 开关灯效果案例: 开灯 开关灯效果案例: 关灯 Column 和 Row 的基本用法 Entry Component struct Index {State message: string 张三;build() {// 一行内容Row() {// 一列内容Column() {// 文本内容Text(this.mess…

IDEA创建Web项目(详细版)

目录 1 新建Web项目 步骤如下 1 打开idea,选择新建项目 2 点击创建 3 点击项目结构&#xff0c;选择添加模块 ---web 2 配置Tomcat 步骤如下 1 点击Edit Configurations&#xff08;编辑配置&#xff09; 1.1 右上角当前文件下 选择编辑配置 1.2 点击菜单栏中run 选…

宝塔linux 安装code-server指定对应的端口无法访问

这个一般就是nginx搞的鬼&#xff0c;如果服务正常启动&#xff0c;就是访问不了&#xff1b;大概就是宝塔安装的nginx配置没有代理code-server服务对应的端口&#xff0c;一般就是nginx配置文件的问题 安装默认的nginx会有一个配置文件 直接拉到最后会有一行这个&#xff0c…