当前位置: 首页 > news >正文

P63 C++当中的计时

这篇文章我们来讲一下C++当中的计时。相对精准的计时对于我们评估代码的性能是非常非常重要的。有的时候我们需要对于运行的某段代码进行计时,有的时候我们想要让某件事情在某个时刻发生,或者是有的时候我们需要进行基准测试,都需要使用到计时。

在C++11当中,引入了chrono库,这样我们就可以进行相对比较精确的计时了。但是对于不同的平台,计时方式可能有所区别,如果真的想要非常精准的计时,通常我们需要使用操作系统自带的计时器。因为如果我们想精确测算访问CPU的时间,是需要对于不同平台有不同对应的库的。但是如果不是要求那么精确,那么使用chrono库也就可以了。未来的很多场合,我们可能都会使用到计时,因为要通过timing来展示不同,展示某种方式更好。

我们来看一下这个计时是如何实现的:

#include<iostream>
#include<string>
#include<thread>
#include<chrono>


int main() {
    auto start = std::chrono::high_resolution_clock::now();
    using namespace std::literals::chrono_literals;
    std::this_thread::sleep_for(1s);
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<float> duration = end - start;
    std::cout << duration.count() << std::endl;
    std::cin.get();
}

然后我们输出结果来看一眼:

可以看到差不多就是一秒钟,所以通过这种方式确实统计出了时间。

但是这样使用,我们会发现看起来也太麻烦了,我们希望能不能有一个相对比较简单的道具,可以直接在我们希望的函数开头加上这个计时器,那么在函数结束的时候就可以给我们打印出时间,这样就很nice。

#include<iostream>
#include<string>
#include<thread>
#include<chrono>

struct MyTimer {
    std::chrono::steady_clock::time_point start;
    MyTimer() {
        start = std::chrono::high_resolution_clock::now();
    }
    ~MyTimer() {
        auto end = std::chrono::high_resolution_clock::now();
        std::chrono::duration<float> duration = end - start;
        std::cout << duration.count() * 1000 << "ms" << std::endl;
    }
};

void delay() {
    MyTimer timer;
    using namespace std::literals::chrono_literals;
    std::this_thread::sleep_for(1s);
}

int main() {
    delay();
    std::cin.get();
}

然后我们看看打印出来了什么:

我们可以看到,很顺利的打印出了用时,这个就很赞。

那么接下来我们看看一个简单的优化例子,我们有一个打印Hello World一百次的函数,如下所示:

void print() {
    MyTimer timer;
    for (int i = 0; i < 100; i++) {
        std::cout << "Hello World!" << std::endl;
    }
}

然后我们输出打印需要的时间:

我们可以看到用时不到四毫秒。

然后我们优化一下代码,不使用endl,而是使用\n来看看结果:

void print() {
    MyTimer timer;
    for (int i = 0; i < 100; i++) {
        std::cout << "Hello World!\n";
    }
}

然后我们打印结果:

我们可以看到,时间压缩了将近一半,这样证明了我们确实优化了代码,且达到了相同的结果!

好了,以上就是有关于C++计时的全部内容,希望大家能够喜欢!

相关文章:

  • 不小心更改了/etc权限为777导致sudo,ssh等软件都无法使用
  • “此电脑”中删除WPS云盘方法(百度网盘通用)
  • 10 【HarmonyOS NEXT】 仿uv-ui组件开发之Avatar头像组件开发教程(一)
  • 为何吹订单?因为特斯拉的销量已遥遥领先,掩耳盗铃之举!
  • 第10章 metasploit(网络安全防御实战--蓝军武器库)
  • 每日一题----------异常处理
  • 【Python运维】实现高效的自动化备份与恢复:Python脚本从入门到实践
  • 数据结构---八大排序
  • Python的学习篇(七)--网页结构
  • 数据清洗与治理:为大模型预训练打造完美数据
  • Python已知后序遍历和中序遍历,求先序遍历
  • 字典树(trie树)详解
  • TCP/IP 5层协议簇:网络层(ICMP协议)
  • 如何学习编程?
  • Windows Server开启审计功能
  • Release of anyui for LVGL v0.27.0
  • grum-与gam-词源故事
  • 【数据分享】1999—2023年我国地级市污染物排放和环境治理数据
  • 【MySQL】数据库基础
  • 【计算机网络】TCP
  • 有没有接单做加工的网站/广州网络推广外包
  • 外贸网站模板哪里下载/推广的软件
  • 营口网站建设公司/网络营销渠道的特点
  • 武汉最好的网站建设前十/电脑优化工具
  • 新疆建设兵团职改办网站/seo产品推广
  • 2003系统建网站/友情链接检查工具