C++测量性能

C++测量性能

性能,功耗,稳定性是衡量软件质量的重要指标。关注软件性能就是希望用最少时间做正确的事情,相同的输入在得到期望的输出过程中使用最少时间就意味着性能最优。优秀的软件架构,优秀的算法都是提高软件性能的重要手段。

我们平时写C++软件时候,可以如何测量软件性能呢。

这里分享一个简单好用的测试性能的方法。

C++计时工具

C中通常使用<time.h>,而在C++中使用<chrono>来表示时间。

三个时钟

std::chrono命名空间中有三个时钟,他们的区别为:

std::chrono::sytem_clock。是全系统的实时时钟。该时钟有辅助函数to_time_t和from_time_t,用于将时间点转换成日期。

std::chrono::steady_clock。 只提供一个时钟,保证你不能调整它,它一直在增长。因此,std::chrono::steady_clock是等待一个时间长度或用于记录程序耗时的首选时钟。

std::Chrono::high_resolution_clock。是具有最高精度的时钟,相当于 steady_clock 的高精度版本。

C++标准没有对时钟的精度、起点或有效时间范围提供保证。通常,std::chrono:system_clock的起点是1970年1月1号,即所谓的UNIX-epoch。对于std::chrono::steady_clock,通常是你的PC的启动时间。

time_point

用于记录一个时间点,std::chrono::time_point是一个模板类,可以结合时钟使用。

duration

类模板std::chrono::duration表示一个时间间隔。

自制计时器

可以看到下面的代码,在计时器Timer创建时候时候,内部记录启动时间。当Timer对象退出作用域时候或者主动调用Stop时候,停止计时,并打印出软件执行时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
* Copyright (C) 2022 hangliebe.com
*/
#include <iostream>
#include <chrono>
#include <thread>


class Timer
{
public:
Timer()
{
startTime_ = std::chrono::steady_clock::now();
}

~Timer()
{
Stop();
}

void Stop()
{
std::chrono::time_point<std::chrono::steady_clock> endTime;
endTime = std::chrono::steady_clock::now();
auto inta = endTime - startTime_;
std::cout << inta.count() << "ns" << "(" << inta.count() / 1000000 << "ms)"<< std::endl;
}

private:
std::chrono::time_point<std::chrono::steady_clock> startTime_;

};

下面是一个简单的使用场景

1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
{
Timer timer;
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
}

{
Timer timer;
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
}
}

打印结果:

5000088381ns(5000ms)
10000095766ns(10000ms)



关注博客或微信搜索公众号多媒体与图形,获取更多内容,欢迎在公众号留言交流!
扫一扫关注公众号
作者

占航

发布于

2023-02-18

更新于

2023-10-04

许可协议

评论