C/C++ 记录时间

http://stackoverflow.com/questions/2808398/easily-measure-elapsed-time

https://github.com/picanumber/bureaucrat/blob/master/time_lapse.h



#include <ctime>

void f() {
  using namespace std;
  clock_t begin = clock();

  code_to_time();

  clock_t end = clock();
  double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
}

The time() function is only accurate to within a second, but there are CLOCKS_PER_SEC "clocks" within a second. This is an easy, portable measurement, even though it‘s over-simplified.


up vote98down vote

+50

You can abstract the time measuring mechanism and have each callable‘s run time measured with minimal extra code, just by being called through a timer structure. Plus, at compile time you can parametrize the timing type (milliseconds, nanoseconds etc).

Thanks to the review by Loki Astari and the suggestion to use variadic templates. This is why the forwarded function call.

#include <iostream>
#include <chrono>

template<typename TimeT = std::chrono::milliseconds>
struct measure
{
    template<typename F, typename ...Args>
    static typename TimeT::rep execution(F&& func, Args&&... args)
    {
        auto start = std::chrono::steady_clock::now();
        std::forward<decltype(func)>(func)(std::forward<Args>(args)...);
        auto duration = std::chrono::duration_cast< TimeT>
                            (std::chrono::steady_clock::now() - start);
        return duration.count();
    }
};

int main() {
    std::cout << measure<>::execution(functor(dummy)) << std::endl;
}

Demo

According to the comment by Howard Hinnant it‘s best not to escape out of the chrono system until we have to. So the above class could give the user the choice to call count manually by providing an extra static method (shown in C++14)

template<typename F, typename ...Args>
static auto duration(F&& func, Args&&... args)
{
    auto start = std::chrono::steady_clock::now();
    std::forward<decltype(func)>(func)(std::forward<Args>(args)...);
    return std::chrono::duration_cast<TimeT>(std::chrono::steady_clock::now()-start);
} 

// call .count() manually later when needed (eg IO)
auto avg = (measure<>::duration(func) + measure<>::duration(func)) / 2.0;

and be most useful for clients that

"want to post-process a bunch of durations prior to I/O (e.g. average)"



The complete code can be found here. My attempt to build a benchmarking tool based on chrono is recorded here.



If C++17‘s std::invoke is available, the invocation of the callable in execution could be done like this :

invoke(forward<decltype(func)>(func), forward<Args>(args)...);

to provide for callables that are pointers to member functions.

时间: 2025-01-13 15:34:37

C/C++ 记录时间的相关文章

产品线上问题记录一:启动页仅记录时间未检查升级,导致不能弹出自动更新弹窗

记软件测试线上问题一: 启动页仅记录时间未检查升级,导致不能弹出自动更新弹窗 上线日期: V1.2.0 2016年12月20日 V1.3.1 2017年2月23日 问题经过描述: 最新版本集成了一个文件,所以领导要运营数据,然后发现不弹自动升级弹窗,只能手动更新,查看版本使用用户的时候发现近50%用户在使用老版本V1.2.0,并未升级,数据如下: 1.0版本数量168,1.1.0版本数量6562,1.1.1版本数量9286,1.2.0版本数量19679,1.3.0版本数量2829,1.3.1版本

Unity记录时间

记录时间 在Unity中记录时间需要用到 Time 类.Time类中比较重要的变量为 deltaTime(只读),它指的是从最近一次调用Update 或者 FixedUpdate 方法到现在的时间. 如果想均匀的旋转一个物体,不考虑帧率的情况下,可以乘以 Time.DataTime .具体操作时可以使用如下代码 using UnityEngine; //引入系统包 using System.Collections; //声明类 public class NewBehaviourScript {

window.setTimeout和window.setInterval的区别,及用其中一个方法记录时间。

window.setTimeout(语句,时间)是在多久之后执行语句,语句只执行一次. window.setInterval(语句,时间)是每隔多久执行一次语句,语句循环执行. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <span

记录——时间轮定时器(lua 实现)

http://www.cnblogs.com/mmc1206x/p/6849172.html 很长一段时间里,我错误的认识了定时器.无意中,我发现了“时间轮”这个名词,让我对定时器有了新的看法. 我错误的认为,定时器只需要一个 tick 队列,按指定的时间周期遍历队列,检查 tick 倒计时满足触发条件就触发回调. tick 定义如下: 1 struct Tick { 2 int_t n; 3 func_t func; 4 }; 遍历触发实现如下: 1 void Update() 2 { 3 f

Raspberry Pi开发之旅-发送邮件记录时间及IP

由于我使用树莓派的场景大多数是在没有显示器.只用terminal连接它的情况下,所以,它的IP地址有时会在重启之后变掉(DHCP的),导致我无法通过terminal连接上它.然后我又要很麻烦地登录路由器的管理界面里,去看它被分配到的新IP是什么,然后用terminal重连,太麻烦了,不是么?作为一个树莓派玩家,这种麻烦简直是无法接受的! 为了解决这个问题,我让Pi开机的时候,自动向我指定的Email发送一封邮件,告诉我它此次开机时的IP地址. 步骤: 开机时执行一个脚本,检测网络可用性→网络通畅

FindControl什么时候才会使用ObjectFromHWnd函数呢?——VCL很难调试,加一个日志函数,记录时间

IsDelphiHandleFindVCLWindowfunction IsVCLControl(Handle: HWND): Boolean;function FindControl(Handle: HWND): TWinControl;function FindVCLWindow(const Pos: TPoint): TWinControl; function FindControl(Handle: HWnd): TWinControl; var OwningProcess: DWORD;

统计自己写了多少行代码并记录时间和行数

package DAYTWO; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date; public class 输出写了多

分享一个R语言的脚本【时间记录】

分享一个R语言的脚本 最近捣弄下一个R语言的脚本,不知道大家有没有看过<奇特的一生>这本书,我高中看了后,高三就山寨了柳比歇夫大神的方法,记录时间开销.个人感觉是挺有用的. 脚本就是把下面的这种excel文件导入并自动转化成饼形图,输出图片到本地. 代码在此: record <- read.table("Book1.csv", header=TRUE,sep=",", fill=TRUE); library(ggplot2); new_sum<

ANSYS 命令流记录计算时间

前言:ANSYS 中记录时间有好多种办法,具体网上都有,或者可查阅 help 文件.但本文只针对 APDL 操作下,利用命令流对某一操作或求解步骤的时间统计.目前我使用的是 ANSYS 14.0 版本,相应的信息也都是在其 help 文件中获得,现整理如下: 本文来历: 我在统计计算数据时,需要得知 ANSYS 求解的时间来进行效率对比,由于之前的模型都是由命令流控制,而且 MATLAB 里面可以通过 tic toc 来记录间隔时间,因此联想是否同样有相关命令流操作可以记录 ANSYS 中的计算