• [C/C++]C/C++计算代码的运行时间


    有很多时候,实现一个功能后可能不仅仅要效果,还要效率,如果可以在极短的时间内完成一个功能那当然是最好不过的啦,但是可能经常会事与愿违。

    这里就写一下,都可以怎样用C/C++或者Qt的方法来测试代码的运行时间。

    一、C/C++方法

    1.1 clock_t方法

    clock_t方法需要包含头文件<time.h>,clock_t是一个长整型数字,它可以将时间精确到毫秒级别:

    #include <time.h>
    
    clock_t start, finish;
    start = clock();
    ... 
    function();
    ... 
    finish = clock();
    int duration = finish - start;
    
    double durationS = (double)duration / CLOCKS_PER_SEC;//如果需要换算成秒

    1.2 使用windows API 1

    头文件#include<Windows.h>,主要函数GetTickCount(),能达到毫秒级别:

    #include <Windows.h> 
    
    DWORD start_time = GetTickCount(); 
    ... 
    function(); 
    ... 
    DWORD end_time = GetTickCount(); 
    DWORD duration = start_time - end_time;

    1.3 使用Windows API 2

    头文件依然是#include<Windows.h>,但是这次不一样,可以达到微秒级别:

    #include <windows.h> 
    
    double run_time; 
    _LARGE_INTEGER time_start; //开始时间 
    _LARGE_INTEGER time_over; //结束时间 
    double dqFreq; //计时器频率 
    LARGE_INTEGER f; //计时器频率 
    
    QueryPerformanceFrequency(&f); 
    dqFreq=(double)f.QuadPart; 
    QueryPerformanceCounter(&time_start); //计时开始 
    
    ... 
    function(); 
    ... 
    
    QueryPerformanceCounter(&time_over); //计时结束 
    
    //乘以1000000把单位由秒化为微秒,精度为1000 000/(cpu主频)微秒 
    run_time=1000000*(time_over.QuadPart-time_start.QuadPart)/dqFreq;

    也可以这么用的:

    LARGE_INTEGER nFreq; LARGE_INTEGER t1; 
    LARGE_INTEGER t2; 
    
    QueryPerformanceFrequency(&nFreq); 
    
    QueryPerformanceCounter(&t1); 
    double dtStart = t1.QuadPart; 
    
    ... 
    function(); 
    ... 
    
    QueryPerformanceCounter(&t2); 
    
    double dtEnd = t2.QuadPart; //后面的1000表示毫秒整数,微秒小数 
    
    double elapsed = (dtEnd - dtStart) / (double)nFreq.QuadPart * 1000;

    二、Qt方法

    Qt方法的话主要还是用到QTime类,Qt的方法基本上都只能精确到毫秒级别。

    QTime startTime = QTime::currentTime();
    
    ...
    function();
    ...
    
    QTime stopTime = QTime::currentTime();
    int elapsed = startTime.msecsTo(stopTime);

    要注意这个方法的是,如果你的代码块运行时间超级短,或者说是达到几个毫秒的级别的话,这个方法慎用,有毒,有时候直接就是0。

    另一个也是Qt的QTime的方法,也是毫秒级别的,也是慎用:

    QTime time;
    time.start();
    
    ...
    function();
    ...
    
    int timeElapsed = time.elapsed();

    三、结论

    我个人的话,会相对比较推荐用clock_t的方法吧,这个好像是C/C++的东西,不算windows API的吧,一般来说冲突会相对比较少吧,如果对时间要求达到毫秒级别就满足的话,那如果是要达到微秒级别,那就没办法,暂时能找到的也就是1.3方法提到的window API 2的方法,但是这个因为直接用windows API,我竟然在某些场合下出现冲突的情况!!!

    泪眼问花花不语,乱红飞过秋千去。

    上善若水,为而不争。
  • 相关阅读:
    springboot检索之Elasticsearch简介
    springboot消息之AmqpAdmin管理组件的使用
    springboot消息之@RabbitListener和@EnableRabbit
    springboot消息之利用docker安装rabbitmq并测试三种模式
    【python-leetcode03-滑动窗口法】无重复字符的最大子串
    JAVA 设置模块间的依赖关系
    Oracle 中Number的长度定义
    js获取当前日期一年的第几周
    Eclipse利用Maven快速上手搭建MyBatis
    JAVA 8 新特性Stream初体验
  • 原文地址:https://www.cnblogs.com/Bearoom/p/11721803.html
Copyright © 2020-2023  润新知