눈팅하는 게임개발자 블로그

스마트 포인터와 일반 포인터의 성능 차이 본문

공부한거/Cpp

스마트 포인터와 일반 포인터의 성능 차이

Palamore 2020. 11. 12. 20:32

스마트 포인터는 포인터를 사용할 때의 메모리 누수 가능성을 아예 차단하기 때문에 정말 좋은 도구이지만

얼마 전에 게임 서버에서는 스마트 포인터가 성능이 안 좋기 때문에 잘 사용하지 않는다라는 이야기를 들었다.

충격적이였다. 스마트 포인터를 배우고 나서는 이게 마치 절대적인 진리인 것마냥 생각했었는데.

이런 건 직접 검증해보는 편이 좋다.

 

스마트 포인터를 사용한 스택타입

template <typename T>
class StackType
{
public:

	StackType();
	void Insert(const T& data);
	T Pop();
	T GetTop() const;
	size_t GetLength() const;

private:
	size_t mLength;
	std::shared_ptr<StackElement<T>> mTop;
};

처음 템플릿으로 구현했던 녀석이다.

템플릿은 컴파일 타임에 사용될 타입에 맞는 코드를 미리 생성하므로 실행시간과는 관련이 없다.

따라서 그냥 사용한다.

스마트 포인터를 사용하지 않은 스택타입

class Sutack {
public:
	Sutack();
	void Insert(const int& data);
	int Pop();
	int GetTop() const;

	size_t GetLength() const;
private:
	size_t mLength;
	SutackNode* mTop;
};

메인 함수

	StackType<int> s;
	clock_t start = 0, end = 0;
	start = clock();
	for (int i = 0; i < 100000; i++)
	{
		s.Insert(i);
	}
	for (int i = 0; i < 100000; i++)
	{
		s.Pop();
	}
	end = clock();

	std::cout << end - start << std::endl;

	Sutack u;
	start = clock();
	for (int i = 0; i < 100000; i++)
	{
		u.Insert(i);
	}
	for (int i = 0; i < 100000; i++)
	{
		u.Pop();
	}
	end = clock();

	std::cout << end - start << std::endl;

이 두개의 클래스로 시간을 측정해보면.

Insert 10만번, Pop 10만번을 실행했을 경우의 경과시간은 다음과 같다.

무려 10배가 넘게 차이가 난다. 2배 3배도 아니고 무려 10배가 차이난다.

 

다음은 100만번씩 실행했을 경우의 경과 시간.

 

물론 메모리 누수가 나는 것보다는 스마트 포인터를 사용하는 편이 좋겠지만

이렇게 성능 차이가 10배라면 얘기가 달라진다.

성능이 중요한 환경에서는 스마트 포인터를 사용하지 않는 것이 좋겠다.

 

 

+

혹시나 템플릿이 런타임 실행시간에 영향을 줄 수 있는 가능성이 있나? 라는 생각이 들었고

일반 포인터 스택타입도 템플릿으로 만들어서 실험해보았다. (위 아래 순서도 바꿨다.)

경과 시간이 조금 늘어났긴 하지만

둘의 성능 차이가 10배 이상인 부분은 변함이 없었다.

 

++

C++ STL의 스택을 추가해서 돌려보았다. (일반 스택, 스마트포인터 스택, STL 스택 순)

STL이랑도 성능 차이가 발생한다.

'공부한거 > Cpp' 카테고리의 다른 글

RAII(Resource Acquisition is Initialization)  (0) 2020.10.01
RVO(Return Value Optimization)  (0) 2020.09.30