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

 更新时间:2024年09月23日 10:00:53   作者:ucliaohh  
这篇文章主要介绍了C++下程序运行时间的四种常用计时方法,介绍了几种常用的计时方法,包括低精度的clock()和GetTickCount(),以及高精度的gettimeofday()和QueryPerformanceCounter(),需要的朋友可以参考下

前言

记录下当前时间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 <time.h>   //引入头文件
int main()
{
clock_t start,end;   //定义clock_t变量
start = clock();     //开始时间

fun()  //需计时的函数

end = clock();   //结束时间
cout<<"time = "<<double(end-start)/CLOCKS_PER_SEC<<"s"<<endl;  //输出时间(单位:s)
}

二、GetTickCount()

GetTickCount()是一个Windows API,所需头文件为<windows.h>。

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

#include <windows.h>   //引入头文件
int main()
{
    DWORD t1,t2;
    t1 = GetTickCount();

    fun()  //需计时的函数

    t2 = GetTickCount();
    cout<<"time = "<<((t2-t1)*1.0/1000)<<endl;  //输出时间(单位:s)
}

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

三、QueryPerformanceCounter()

QueryPerformanceCounter()是一个Windows API,所需头文件为<windows.h>

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

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

#include <windows.h>   //引入头文件
int main()
{
    LARGE_INTEGER t1,t2,tc;
    QueryPerformanceFrequency(&tc);
    QueryPerformanceCounter(&t1);

    fun()  //需计时的函数

    QueryPerformanceCounter(&t2);
    time=(double)(t2.QuadPart-t1.QuadPart)/(double)tc.QuadPart; 
    cout<<"time = "<<time<<endl;  //输出时间(单位:s)
}

四、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系统调用方法--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()。

总结

到此这篇关于C++下程序运行时间的四种常用计时方法的文章就介绍到这了,更多相关C++程序运行时间计时方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言函数指针的老生常谈

    C语言函数指针的老生常谈

    这篇文章主要为大家介绍了vue组件通信的几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • C语言数据结构递归之斐波那契数列

    C语言数据结构递归之斐波那契数列

    这篇文章主要介绍了C语言数据结构递归之斐波那契数列的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C/C++ 中sizeof(''a'')对比详细介绍

    C/C++ 中sizeof(''a'')对比详细介绍

    这篇文章主要介绍了C/C++ 中sizeof('a')的值对比详细介绍的相关资料,需要的朋友可以参考下
    2017-02-02
  • 详解C语言中的字符串数组

    详解C语言中的字符串数组

    这篇文章主要介绍了C语言中的字符串数组,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

    关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

    可变参数的函数原理其实很简单,而va系列是以宏定义来定义的,实现跟堆栈相关.我们写一个可变函数的C函数时,有利也有弊,所以在不必要的场合,我们无需用到可变参数。如果在C++里,我们应该利用C++的多态性来实现可变参数的功能,尽量避免用C语言的方式来实现
    2013-10-10
  • C/C++中异常处理详解及其作用介绍

    C/C++中异常处理详解及其作用介绍

    这篇文章主要介绍了C/C++中异常处理详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++连接mysql数据库并读取数据的具体步骤

    C++连接mysql数据库并读取数据的具体步骤

    在实际开发中我们经常需要对数据库进行访问,针对不同类型的数据库(如MySQL、sqLite、Access、Excel等),如果采用不同的方法进行连接,会把我们搞崩溃,下面这篇文章主要给大家介绍了关于C++连接mysql数据库并读取数据的具体步骤,需要的朋友可以参考下
    2023-04-04
  • Visual Studio 2019配置OpenCV4.1.1详细图解教程

    Visual Studio 2019配置OpenCV4.1.1详细图解教程

    这篇文章主要介绍了Visual Studio 2019配置OpenCV4.1.1详细图解教程 ,需要的朋友可以参考下
    2020-02-02
  • C++ shared_ptr智能指针reset()使用示例详解

    C++ shared_ptr智能指针reset()使用示例详解

    这篇文章主要为大家介绍了C++ shared_ptr智能指针reset()使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 用C实现PHP扩展 Image_Tool 图片常用处理工具类的使用

    用C实现PHP扩展 Image_Tool 图片常用处理工具类的使用

    该扩展是基于ImageMagick基础实现的,图片操作调用的是ImageMagick API
    2013-04-04

最新评论