C++实现统计代码运行时间计时器的简单实例

 C++实现统计代码运行时间计时器的简单实例

一、前言

这里记下从网上找到的一些自己比较常用的C++计时代码

二、Linux下精确至毫秒

#include <sys/time.h>
#include <iostream>
#include <time.h>
double get_wall_time()
{
  struct timeval time ;
  if (gettimeofday(&time,NULL)){
    return 0;
  }
  return (double)time.tv_sec + (double)time.tv_usec * .000001;
} 

int main()
{
  unsigned int t = 0;
  double start_time = get_wall_time()
  while(t++<10e+6);
  double end_time = get_wall_time()
  std::cout<<"循环耗时为:"<<end_time-start_time<<"ms";
  return 0;
}

三、Windows下精确至毫秒

#include <windows.h>
#include <iostream> 

int main()
{
  DWORD start, stop;
  unsigned int t = 0;
  start = GetTickCount();
  while (t++ < 10e+6);
  stop = GetTickCount();
  printf("time: %lld ms\n", stop - start);
  return 0;
}

试验中,发现貌似getTickCount函数会有10几毫秒的误差,囧。。。

四、Windows下精确至微秒

//MyTimer.h//
#ifndef __MyTimer_H__
#define __MyTimer_H__
#include <windows.h>  

class MyTimer
{
private:
  int _freq;
  LARGE_INTEGER _begin;
  LARGE_INTEGER _end; 

public:
  long costTime;      // 花费的时间(精确到微秒)  

public:
  MyTimer()
  {
    LARGE_INTEGER tmp;
    QueryPerformanceFrequency(&tmp);//QueryPerformanceFrequency()作用:返回硬件支持的高精度计数器的频率。  

    _freq = tmp.QuadPart;
    costTime = 0;
  } 

  void Start()      // 开始计时
  {
    QueryPerformanceCounter(&_begin);//获得初始值
  } 

  void End()        // 结束计时
  {
    QueryPerformanceCounter(&_end);//获得终止值
    costTime = (long)((_end.QuadPart - _begin.QuadPart) * 1000000 / _freq);
  } 

  void Reset()      // 计时清0
  {
    costTime = 0;
  }
};
#endif  

//main.cpp
#include "MyTimer.h"
#include <iostream> 

int main()
{
  MyTimer timer;
  unsigned int t = 0;
  timer.Start();
  while (t++ < 10e+5);
  timer.End();
  std::cout << "耗时为:" << timer.costTime << "us";
  return 0 ;
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

时间: 2017-07-05

C++如何实现简单的计时器详解

实现分析 首先我们先分析一下计时器的一些功能,简单一点的计时器包括开始.暂停.停止和显示基本功能,这些功能以C++面向对象的编程思想(OOP)进行抽象,就是计时器类(Timer)的4个成员函数,当然我们要把这些函数作为公有的,因为它们是留给外部的接口(interface). 然后我们再分析一下计时器的三种状态:停止,正在运行,暂停(注意:暂停不是停止),那么怎么记录计时器的三种状态呢? 这里我们用布尔类型的变量记录计时器的三种状态,分别为bool is_pause,bool is_stop,在这

C++ 简单的任务队列详解

任务队列是指能够实现任务在多线程间安全传递的先入先出的队列. 任务是指组合了数据和操作的对象,这里面定义为CTask类的对象. 任务的实现: Task.cpp #include "stdafx.h" #include "Task.h" #include <iostream> using namespace std; CTask::CTask(int* nCount) { m_nCount = nCount; } CTask::~CTask() { } v

C# 中SharpMap的简单使用实例详解

本文是利用ShapMap实现GIS的简单应用的小例子,以供学习分享使用.关于SharpMap的说明,网上大多是以ShapeFile为例进行简单的说明,就连官网上的例子也不多.本文是自己参考了源代码进行整理的,主要是WinForm的例子.原理方面本文也不过多论述,主要是实例演示,需要的朋友还是以SharpMap源码进行深入研究. 什么是SharpMap ? SharpMap是一个基于.net 2.0使用C#开发的Map渲染类库,可以渲染各类GIS数据(目前支持ESRI Shape和PostGIS格

CentOS安装mysql5.7 及简单配置教程详解

安装 保证你的用户有权限 安装 没有 切换 root su root (su的意思:swich user) # rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm 可能会遇到 warning: /var/tmp/rpm-tmp.6V5aFC: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY 可以忽略(个人意见,百度了一下没找到合适的答案)

Android 实现夜间模式的快速简单方法实例详解

ChangeMode 项目地址:ChangeMode Implementation of night mode for Android. 用最简单的方式实现夜间模式,支持ListView.RecyclerView. Preview Usage xml android:background="?attr/zzbackground" app:backgroundAttr="zzbackground"//如果当前页面要立即刷新,这里传入属性名称 比如 R.attr.zzb

Linux上安装Mysql及简单的使用详解

1. 安装mysql sudo apt-get update sudo apt-get install mysql-server sudo apt-get install python-mysqldb(如果python中要使用,请安装) 2.登录root用户: mysql -u root -p 3.查看所有数据库: show databases; 4.选择一个数据库操作: use database_name; 5.查看当前数据库下所有的表: show tables; 6.创建一个数据库: cre

IOS文件的简单读写实例详解

IOS文件的简单读写实例详解 数组(可变与不可变)和字典(可变与不可变)中元素对象的类型,必须是NSString,NSArray,NSDictionary,NSData,否则不能直接写入文件 #pragma mark---NSString的写入与读取--- //1:获取路径 NSString *docunments = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObje

微信小程序之网络请求简单封装实例详解

微信小程序之网络请求简单封装实例详解 在微信小程序中实现网络请求相对于Android来说感觉简单很多,我们只需要使用其提供的API就可以解决网络请求问题. 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downloadFile) WebSocket通信(wx.connectSocket) 为了数据安全,微信小程序网络请求只支持https,当然各个参数的含义就不在细说,不熟悉的话可以:可以去阅读官方文档的网络请求api,当我们使用request

Spring Boot的listener(监听器)简单使用实例详解

监听器(Listener)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public ServletListenerRegistrationBean servletListenerRegistrationBean(){ ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean

Kotlin + Retrofit + RxJava简单封装使用详解

本文介绍了Kotlin + Retrofit + RxJava简单封装使用详解,分享给大家,具体如下: 实例化Retrofit object RetrofitUtil { val CONNECT_TIME_OUT = 30//连接超时时长x秒 val READ_TIME_OUT = 30//读数据超时时长x秒 val WRITE_TIME_OUT = 30//写数据接超时时长x秒 val retrofit: Retrofit by lazy { Log.d("RetrofitUtil"