C++中几种测试程序运行时间的方法<转>

转的地址:https://www.cnblogs.com/silentteen/p/7532855.html

1.GetTickCount()函数

原理: GetTickCount()是获取系统启动后的时间间隔。通过进入函数开始定时,到退出函数结束定时,从而可以判断出函数的执行时间(单位ms),这种时间也并非是函数或者算法的真实执行时间,因为在函数和算法线程不可能一直占用CPU,对于所有判断执行时间的函数都是一样,不过基本上已经很准确,可以通过查询进行定时。注意:GetTickCount()精确度有限,跟CPU有关,一般精确度在16ms左右,最精确也不会精确过10ms。
头文件:

include<windows.h>

测试:

int t1 = long t1 = GetTickCount();
    //...测试代码
int t1 = long t2 = GetTickCount();
cout << "运行时间:"<<(t2-t1) << endl;

2.高精度时控函数QueryPerformanceFrequency(),QueryPerformanceCounter()

原理:QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数. 计算确切的时间是从第一次调用QueryPerformanceCounter()开始的假设得到的LARGE_INTEGER为nStartCounter,过一段时间后再次调用该函数结束的,设得到nStopCounter.两者之差除以QueryPerformanceFrequency()的频率就是开始到结束之间的秒数.由于计时函数本身要耗费很少的时间,要减去一个很少的时间开销.但一般都把这个开销忽略。
头文件:

#include<windows.h>  

测试:

double time=0;
double counts=0;
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);//开始计时
    //...测试代码
QueryPerformanceCounter(&nEndTime);//停止计时
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart;//计算程序执行时间单位为s
cout<<"运行时间:"<<time*1000<<"ms"<<endl;

3.使用Boost库中的timer

timer类可以测量时间的流逝,是小型计时器,提供毫秒级别的计时精度。
头文件:

#include<boost/timer.hpp> 

测试:

timer t;//声明计时器对象并开始计时
    //...测试代码
cout<<"运行时间:"<<t.elapsed() <<"s"<<endl;//输出已流失的时间

原文地址:https://www.cnblogs.com/wainiwann/p/9133295.html

时间: 2024-10-10 11:07:46

C++中几种测试程序运行时间的方法<转>的相关文章

ASIC设计中一种通用型并行设计方法

我是个"低调"的人,总不喜欢表达出来,对异性如此,对工作也是如此.在翔哥的鼓励下,决定把自己工作的一些经验和思考写下来,和同道们一起分享. ASIC设计中一种通用型并行设计方法: 1)流水网的概念提出 IC设计中的控制有串行和并行两种思想.状态机方法反应了串行控制思想,有软件的思路,比较好理解,新手比较喜欢用.流水线方法是并行处理的思想,比较抽象,因为其效率高,老手喜欢用.从"流水线"的名字就容易知道,它只是一维的一条线,一个设计中可以有很多条.小设计中可能很容易设

JSP中四种传递参数的方法

jsp中四种传递参数的方法,我觉得总结一下,挺好的,以备后用! 1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="index.jsp"?a=a&b=b&c=c>name</a> 1.form表单 form.jsp: <%@page contentType="text/html; charset=GB2312"%> &l

ES6中6种声明变量的方法

ES5 只有两种声明变量的方法:var命令和function命令. ES6 除了添加let和const命令,还有两种声明变量的方法:import命令和class命令. 所以,ES6 一共有 6 种声明变量的方法. (1) var命令. var a ; //undefined var b = 1; var定义的变量可以修改,如果不初始化会输出undefined,不会报错 var 声明的变量在window上,用let或者const去声明变量,这个变量不会被放到window上 很多语言中都有块级作用域

Java Web开发Tomcat中三种部署项目的方法

一般情况下,开发模式下需要配置虚拟主机,自动监听,服务端口,列出目录文件,管理多个站点等功能 准备工作: 软件包:apache-tomcat-6.0.20.rar 将软件包解压至硬盘一分区,进入%TOMCAT_HOME%/conf目录 一:server.xml 配置 1.配置端口,修改server.xml. <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000"

Android 中三种启用线程的方法

在多线程编程这块,我们经常要使用Handler(处理),Thread(线程)和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢? 首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应.  而Runnable是一个接口,Thread是Runnable的子类.所以说,他俩都算一个进程.  HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息

JdbcTemplate查询数据中两种处理结果集方法的简单比较

public List<Cat> listCats(){ //多条数据查询 String sql = "select id, name, description, mother_id, createDate from tbl_cat"; /*//方法1.使用RowMapper<Cat>处理结果集 return jdbcTemplate.query(sql, new RowMapper<Cat>(){ @Override public Cat mapR

分布式缓存中三种负载均衡的方法

本文主要是比较三种分布缓存负载均衡的方法,第一种是最简单的将 key的hash值对机器数取模算法,第二种是一致性哈希算法,第三种是淘宝开源的缓存解决方案tair的均衡算法.下面来分析下这三种算法的优缺点. 第一种:传统的数据分布方法,将key的hash值对机器数取模 这个算法的实现非常简单,计算hash(key)/n,n为机器数,得到的值就是该key需要路由到的服务器编号了. 优点:实现简单 缺点:在服务器数量发生变化的时候,缓存会大量失效. 第二种:一致性hash 试想下如果使用传统取模算法.

C/C++中几种操作位的方法

参考How do you set, clear and toggle a single bit in C? c/c++中对二进制位的操作包括设置某位为1.清除某位(置为0).开关某位(toggling a bit).检查某位是否为1等.这些操作较为常见并且可以作为其他位运算的基础接口,以下罗列几种方法: 传统方法 设置某位为1 number |= 1 << x; // 设置第x位为1 清除某位 number &= ~(1 << x); // 置第x位为0 开关某位 numb

Java中四种遍历List的方法

1 package com.ietree.basic.collection.loop; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 /** 8 * List遍历 9 * 10 * @author Dylan 11 */ 12 public class ListLoop { 13 14 public static void main(String[] args)