C++ 생성자 멤버 이니셜라이저와 대입 초기화 간단 성능비교.

Mr.뉴트리아·2023년 2월 22일
0

C++

목록 보기
1/1

개요

C++에선 생성자 내부에서 대입을 통해 멤버를 정의하는 방법보단 멤버 이니셜라이저라는 특수한 문법으로 정의를 해주는 것을 권장한다. 성능면에서 전자보단 후자가 상대적인 이득을 본다는 것인데, 다른 블로그를 찾아봐도 "어느정도 " 차이가 나는지는 없어 짤막하게 테스트 해보려고 한다.

코드

#include <iostream>
#include <thread>
#include <time.h>

using namespace std;

class MyClass
{
public:
	MyClass() = delete;
	MyClass(int number)//이니셜라이저를 사용하지 않고, 대입을 통해 초기화
	{
		m_number1 = number;
		m_number2 = number;
		m_number3 = number;
		m_number4 = number;
	}
private:
	int m_number1;
	int m_number2;
	int m_number3;
	int m_number4;
};


class MyClass2
{
public:
	MyClass2() = delete;
	MyClass2(int number) ://이니셜라이저를 통해 초기화
		m_number1(number),
		m_number2(number),
		m_number3(number),
		m_number4(number)

	{

	}
private:
	int m_number1;
	int m_number2;
	int m_number3;
	int m_number4;

};


int main()
{
	bool ThreadDone1 = false;
	bool ThreadDone2 = false;

	thread Thread1([&ThreadDone1]()
	{
		clock_t start = clock();

		for (int i = 0; i < INT_MAX; i++)
		{
			MyClass a(5);
		}

		clock_t end = clock();

	std::cout << "Thread1 done Time : " << double(end - start) / CLOCKS_PER_SEC << "\n";
	ThreadDone1 = true;
	});
	Thread1.detach();


	thread Thread2([&ThreadDone2]()
	{
		clock_t start = clock();

		for (int i = 0; i < INT_MAX; i++)
		{
			MyClass2 a(5);
		}
		clock_t end = clock();
	std::cout << "Thread2 done Time : " << double(end - start) / CLOCKS_PER_SEC << "\n";

	ThreadDone2 = true;
	});
	Thread2.detach();
	
	while (ThreadDone1 != true || ThreadDone2 != true)
	{

	}

}

스레드 1번은 단순 대입 초기화, 스레드2번은 멤버 이니셜라이저를 이용한 초기화를 해주는 클래스를 반복 생성한다.

테스트 결과

테스트 1번

테스트 2번

테스트 3번

대략 6~9%정도의 성능 차이가 발생한다.

결론

C++의 말대로, 정의해주는 위치만 변경되었을 뿐인데 명확한 성능 차이를 보인다. 습관을 들여서라도 멤버 이니셜라이저를 자주 사용해야겠다는 생각이 들었다.

profile
뉴트리아는 가시쥐과에 속하는 설치류의 일종이다. 오랫동안 뉴트리아과의 유일종으로 분류했지만, 현재는 가시쥐과에 포함시킨다. 늪너구리, 해리서 또는 코이푸라고도 한다. 뉴트리아는 스페인어로 수달을 의미하고, 출생지 남미에서는 이 종류를 코이푸라고 부른다.

0개의 댓글