c++ 准确计时_C++下四种常用的程序运行时间的计时方法总结-程序员宅基地

技术标签: c++ 准确计时  

记录下当前时间start,调用程序fun(),再记录一下时间end。

前后时间一减(start-end)就得到程序的运行时间了。

首先介绍最常用的,但两种精度不是很高(>=10ms)的方法:clock()和GetTickCount()

一、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    //引入头文件

int main()

{

clock_t start,end;   //定义clock_t变量

start = clock();    //开始时间

fun() //需计时的函数

end = clock(); //结束时间

cout<

}

二、GetTickCount()

GetTickCount()是一个Windows API,所需头文件为。

返回从操作系统启动到现在所经过的毫秒数(ms),精确度有限,跟CPU有关,一般精确度在16ms左右,最精确也不会精确过10ms。它的返回值是DWORD,当统计的毫妙数过大时,将会使结果归0,影响统计结果.

#include    //引入头文件

int main()

{

DWORD t1,t2;

t1 = GetTickCount();

fun() //需计时的函数

t2 = GetTickCount();

cout<

}

接下来是两种高精度的计时方法:gettimeofday() 和 QueryPerformanceCounter()

三、QueryPerformanceCounter()

QueryPerformanceCounter()是一个Windows API,所需头文件为

这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter() 确切的精确计时的最小单位是与系统有关的,

所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率. QueryPerformanceFrequency() 提供了这个频率值,返回每秒嘀哒声的个数.

#include    //引入头文件

int main()

{

LARGE_INTEGER t1,t2,tc;

QueryPerformanceFrequency(&tc);

QueryPerformanceCounter(&t1);

fun() //需计时的函数

QueryPerformanceCounter(&t2);

time=(double)(t2.QuadPart-t1.QuadPart)/(double)tc.QuadPart;

cout<

}

四、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    //引入头文件

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<

}

还有一种C系统调用方法--time(),但是精度很低(秒级),不建议使用,这里就稍微带下用法。

time_t start,stop;

start = time(NULL);

fun();

stop = time(NULL);

附带三种计算Python的代码块或程序的运行时间的方法

方法一

import datetime

start = datetime.datetime.now()

run_function():

# do something

end = datetime.datetime.now()

print (end-start

方法二

import time

start = time.time()

run_function()

end = time.time()

print str(end)

方法三

import time

start = time.clock()

run_function()

end = time.clock()

print str(end-start)

其中,方法二的精度比较高。方法一基本上是性能最差的。这个其实是和系统有关系的。一般我们推荐使用方法二和方法三。我的系统是Ubuntu,也就是Linux系统,方法二返回的是UTC时间。 在很多系统中time.time()的精度都是非常低的,包括windows。

总概来讲,在 Unix 系统中,建议使用 time.time(),在 Windows 系统中,建议使用 time.clock()。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39570505/article/details/111781097

智能推荐

Linux系统之cut命令的基本使用_linux cut 大写g-程序员宅基地

文章浏览阅读902次,点赞2次,收藏2次。Linux系统之cut命令的基本使用_linux cut 大写g

java中设置JButton的背景图片,并在它上面显示文字_jbutton设置背景图片-程序员宅基地

文章浏览阅读2.3w次,点赞14次,收藏56次。看下面这段代码: JPanel contentPanel = new JPanel(); contentPanel.setBackground(Color.BLACK); setContentPane(contentPanel); ImageIcon icon = new ImageIcon("C:\\Users\\lenovo\\Desktop\\button.jpg"); JBu_jbutton设置背景图片

模块的导入和引入_js 多个export 如何放在index-程序员宅基地

文章浏览阅读756次。要知道的es6和node都支持的引入:require只有node支持的导出:exports和module.exports只有es6支持的导出引入:export和importnode模块的导出导入引入:require导出:exports或module.exportsNode里面的模块系统遵循的是CommonJS规范。那问题又来了,什么是CommonJS规范呢?由于js以前比较混乱,各写各的代码,没有一个模块的概念,而这个规范出来其实就是对模块的一个定义。CommonJS定义的模_js 多个export 如何放在index

AngularJS快速入门指南06:过滤器-程序员宅基地

文章浏览阅读84次。  通过管道字符(‘|’),过滤器可以被添加到表达式和指令中。AngularJS过滤器  AngularJS过滤器可以被用来转换(格式化)数据:过滤器描述currency将数字格式化为现金格式。filter从一个集合中选择子项。lowercase将字符串转换为小写形式。orderBy通过一个表达式对集...

江湖:任正非的仁义,王石的格局,柳传志的心胸,俞敏洪的情怀!-程序员宅基地

文章浏览阅读893次。任正非对李一男:让离开的人过得更好去年3月,李一男因涉嫌内幕交易罪在深圳市中级人民法院受审。于是,一些关于李一男在当初忘恩负义离开华为对不起任正非的言论开始在网络上蔓延,声讨之声不绝于耳。我只想说,这样的结论下得太武断了,至少作为当事人的任正非在公开场合从来也没有这样表述过。1993年6月,23岁的李一男加入到华为公司,这个年轻人怎么也想不到任正非会如此重用他。...

Windows的用户和组管理_windows用户和组的管理-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏17次。不同的用户身份拥有不同的用户权限,每个用户拥有一个用户名和密码,在Windows系统中,每个用户账户具有唯一的安全标示符(Security Identifier,SID)在windows系统中管理员的SID是500,普通用户的SID是从1000开始。_windows用户和组的管理

随便推点

stl文件转stp (二次开发)_stl转stp-程序员宅基地

文章浏览阅读3.6w次,点赞29次,收藏82次。前几天有个美女问我stl文件怎么处理,很尴尬我也处理不了,为了避免再次发生这种情况,所以我做了这个小软件。其下载链接将在文末给出。因为是电脑软件,所以使用的是.net c# 编写,ide是秒天秒地秒空气的visual studio。下面分几步说一下思路和代码过程:1、stl文件和stp文件的数据存储形式一、stl文件格式stl的文件格式是很容易就能找到的,比如说直接问度娘:..._stl转stp

UVa1625——颜色长度(DP)_dp颜色函数-程序员宅基地

文章浏览阅读239次。题目链接:https://vjudge.net/contest/232313#problem/H思路:紫书上写的很详细了:不是等到一个颜色全部移完之后再相加,而是每次都计算已经开始但还没结束的颜色的个数并将长度累加。所以,用res[i][j]表示第一个串还剩i个,第二个串还剩j个,已经开始但还没结束的字符个数。dp[i][j]表示第一个还剩i个,第二个串还剩j个,还需要的最小指标函数。..._dp颜色函数

AngularJS 简介_angljs-程序员宅基地

文章浏览阅读525次。AngularJS 简介AngularJS诞生于2009年,由MiskoHevery等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入,等等。AngularJS 是一个 JavaScript 框架。它可通过 AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML。AngularJS 是一个 JavaScript 框架A_angljs

【整理】串口(RS232/RS485等)通讯中RTS/CTS,DTR/DSR的含义详解_串口dtr是什么-程序员宅基地

文章浏览阅读9.8k次,点赞6次,收藏37次。【整理】串口(RS232/RS485等)通讯中RTS/CTS,DTR/DSR的含义详解RS232 crifan 7年前 (2013-10-17) 14942浏览 0评论【背景】之前就折腾过很多关于RTS/CTS,DTR/DSR的内容:【整理】RTS/CTS,DTR/DSR的区别【整理】RS232 RTS/CTS的流控制的具体过程/机制【整理】HART协议中串口配置和Handshake(RTS/CTS等)但是至今还是觉得,没有彻底明白,还有有一点点迷惑。现在重新去整理相关._串口dtr是什么

Ubuntu下安装nvidia驱动(详细)_ubuntu server安装nvidia驱动-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏45次。Ubuntu下安装nvidia驱动指南_ubuntu server安装nvidia驱动

支持向量机SVM_支持向量机 r2-程序员宅基地

文章浏览阅读322次。支持向量机SVM(Support Vector Machine)【关键词】支持向量,最大几何间隔,拉格朗日乘子法一、支持向量机的原理Support Vector Machine。支持向量机,其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器。那么什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量。见下图,在一个二维环境中,..._支持向量机 r2