C++学习笔记 38 基准测试

一、什么是基准测试?

当你写了一些代码,你想知道它实际运行有多快,因为你正在处理一个对性能想当关键的,部分,或者你正在测试你刚刚学学的新技术。但是你想把它的性能和你过去做的方法做个比较,看看哪种方法更快,在C++中需要如何做呢?如何实际测量C++代码的性能?

二、确保你测量的部分就是实际上被编译的代码

因为C++编译器可以优化代码,剥离某些代码,甚至完全更改代码。

#include<iostream>
#include<chrono>

class Timer2 {
public:
	std::chrono::steady_clock::time_point start, end;//
	//std::chrono::duration<float> duration;
	Timer2() {
		start = std::chrono::high_resolution_clock::now();
	}
	~Timer2() {
		end = std::chrono::high_resolution_clock::now();
		stop();
	}
	 void stop() {
		auto newStart = std::chrono::time_point_cast<std::chrono::microseconds>(start).time_since_epoch().count();
		auto newEnd = std::chrono::time_point_cast<std::chrono::microseconds>(end).time_since_epoch().count();
		auto duration = newEnd - newStart;
		double ms = duration * 0.001;
		std::cout << "It takes " << duration << " us (" << ms << " ms)\n";
	}
};

void testTimerDebugAndRelease() {
	int value = 0;
	{
		Timer2 timer2;
		for (int i = 0; i < 1000000; i++)
			value += 2;
	}
	std::cout << value << std::endl;
}

int main() {
	
	std::cin.get();
}
  1. debug模式下的汇编结果:有实际CPU执行逻辑
    debug模式下的汇编结果

  2. release模式下的汇编结果:无实际CPU执行逻辑

在release模式下,编译器看了这段代码,并意识到,这并不需要在运行时计算,于是进行了优化,直接在编译时就计算出来了。然后直接打印出2百万,没有进行任何形式的增量计算。那么,这里的计时器的结果将是完全无用的,毫无意义的。
image

  1. 实际案例:测试哪个更快。
#include<iostream>
#include<chrono>
#include<array>

int main() {

	struct Vector2 {
		float x, y;
	};

	std::cout << "Make Shared\n";
	{
		std::array<std::shared_ptr<Vector2>, 1000> sharedPtrs;
		Timer2 timer2;
		for (int i = 0; i < sharedPtrs.size(); i++)
			sharedPtrs[i] = std::make_shared<Vector2>();
		
	}

	std::cout << "New Shared\n";
	{
		std::array<std::shared_ptr<Vector2>, 1000> sharedPtrs;
		Timer2 timer2;
		for (int i = 0; i < sharedPtrs.size(); i++)
			sharedPtrs[i] = std::shared_ptr<Vector2>(new Vector2());
	}

	std::cout << "Make Unique\n";
	{
		std::array<std::unique_ptr<Vector2>, 1000> sharedPtrs;
		Timer2 timer2;
		for (int i = 0; i < sharedPtrs.size(); i++)
			sharedPtrs[i] = std::make_unique<Vector2>();
	}

	std::cin.get();
}
  1. 一定要确保你要测试的代码,在发布时是真正有意义的,因为你不会在调试时发布代码,release会去掉任何多余的东西。
posted @ 2025-12-24 15:55  超轶绝尘  阅读(1)  评论(0)    收藏  举报