Cherno视频:https://www.youtube.com/watch?v=YG4jexlSAjc
Timer 类计算运行时间
注意:这里的Timer类使用了RAII机制
#include<iostream>
#include<memory>
#include<chrono>
class Timer {
public:
Timer() {//Timer构建时开始计时
m_StartTimePoint = std::chrono::high_resolution_clock::now();
}
~Timer() {//Timer销毁时,停止计时 ---->RAII 超出范围对象就被解析
Stop();
}
void Stop() {
auto endTimePoint = std::chrono::high_resolution_clock::now();
auto start = std::chrono::time_point_cast<std::chrono::microseconds>(m_StartTimePoint).time_since_epoch().count();
auto end = std::chrono::time_point_cast<std::chrono::microseconds>(endTimePoint).time_since_epoch().count();
auto duration = end - start;
double ms = duration * 0.001;
std::cout << "duration :" << duration << " us ("<< duration*0.001<<" ms)" << std::endl;
}
private:
std::chrono::time_point<std::chrono::high_resolution_clock> m_StartTimePoint;
};
int main() {
int value = 0;
{
Timer timer;
for (int i = 0; i < 1000000; i++) {
value += 2;
}
std::cout << value << std::endl;
}
__debugbreak();
}
超出运行范围后,Timer解析,自动输出运行时间!
例2:
Debug模式下,测试智能指针初始化时间:shared_ptr 和 unique_ptr
#include<iostream>
#include<memory>
#include<chrono>
#include<array>
class Timer {
public:
Timer() {//Timer构建时开始计时
m_StartTimePoint = std::chrono::high_resolution_clock::now();
}
~Timer() {//Timer销毁时,停止计时 ---->RAII 超出范围对象就被解析
Stop();
}
void Stop() {
auto endTimePoint = std::chrono::high_resolution_clock::now();
auto start = std::chrono::time_point_cast<std::chrono::microseconds>(m_StartTimePoint).time_since_epoch().count();
auto end = std::chrono::time_point_cast<std::chrono::microseconds>(endTimePoint).time_since_epoch().count();
auto duration = end - start;
double ms = duration * 0.001;
std::cout << "duration :" << duration << " us ("<< duration*0.001<<" ms)" << std::endl;
}
private:
std::chrono::time_point<std::chrono::high_resolution_clock> m_StartTimePoint;
};
int main() {
struct Vector2
{
float x, y;
};
{
std::array<std::shared_ptr<Vector2>, 1000> sharedPtrs;
Timer timer;
for (int i = 0; i < sharedPtrs.size(); i++)
{
sharedPtrs[i] = std::make_shared<Vector2>();
}
}
std::cout << "Make shared" << std::endl;
{
std::array<std::shared_ptr<Vector2>, 1000> sharedPtrs;
Timer timer;
for (int i = 0; i < sharedPtrs.size(); i++)
{
sharedPtrs[i] = std::shared_ptr<Vector2>(new Vector2());
}
}
std::cout << "New shared" << std::endl;
{
std::array<std::unique_ptr<Vector2>, 1000> uniquePtrs;
Timer timer;
for (int i = 0; i < uniquePtrs.size(); i++)
{
uniquePtrs[i] = std::make_unique<Vector2>();
}
}
std::cout << "Make unique" << std::endl;
__debugbreak();
}
Relese模式:
Relese模式下会比Debug快很多,因为编译器在程序运行前会做优化,比如预计算
所以,要注意:在测试程序performance时最好在Debug模式下测试!