[iOS] Struct와 Class의 한판승부 - 1

유인호·2024년 4월 9일
0

iOS

목록 보기
39/64

0. 실험 코드

final class TestClass { }

class ClassInClass {
	let a = TestClass()
	let b = TestClass()
	let c = TestClass()
	let d = TestClass()
}

struct StructInClass {
	let a = TestClass()
	let b = TestClass()
	let c = TestClass()
	let d = TestClass()
}

func measureExecutionTime(block: () -> Void) -> TimeInterval {
	 let startTime = CFAbsoluteTimeGetCurrent()
	 block()
	 let endTime = CFAbsoluteTimeGetCurrent()
	 return endTime - startTime
}

var classResultTime: [TimeInterval] = []
var structResultTime: [TimeInterval] = []

for _ in 0..<10 {

	let classTime = measureExecutionTime {
		for _ in 0...100000 {
			let a = ClassInClass()
		}
	}

	classResultTime.append(classTime)

	let structTime = measureExecutionTime {
		for _ in 0...100000 {
			let a = StructInClass()
		}
	}

	structResultTime.append(structTime)
}

print(classResultTime.reduce(0, +))
print(structResultTime.reduce(0, +))

1. 설명

Class 안에 여러 Class의 인스턴스를 넣은 것과, Struct 안에 여러 Class의 인스턴스를 넣었다. 어떤 것이 생성되는 속도가 더 빠를까?

2. 결과

ClassInClass: 27.148070096969604
StructInClass: 26.98146617412567

Struct가 미세하지만 더욱 빠른걸 볼 수 있다.
그 이유는 Class는 힙 영역에, Struct는 스택 영역에 저장되게 되는데, 힙 영역 보다 스택에 메모리가 올라가는 속도가 더 빠르기 때문이다. 여러번 실험해봐도 결과는 비슷하였다.

여기서 추가적으로 궁금한게 생겼다.

Class안에 Struct 인스턴스를 한개 만드는거와
Struct안에 Class 인스턴스를 한개 만드는것,

어떤게 더 빠를까?

ClassInOneStruct: 11.622799038887024
StructInOneClass: 11.662547826766968

ClassInOneStruct: 11.824751853942871
StructInOneClass: 11.790274977684021

ClassInOneStruct: 11.859312891960144
StructInOneClass: 11.95268189907074

ClassInOneStruct: 11.6176118850708
StructInOneClass: 11.643514037132263

여러번의 같은 실험 결과 반대의 사례가 등장하긴 했지만 대체적으로 StructInOneClass가 조금 더 느린 모습을 보여주었는데, 왜지..?

3. 결론..?

G선생님의 답변으로는..

이 코드에서 StructInOneClass는 구조체가 클래스를 포함하고 있습니다. 이는 각 인스턴스가 생성될 때마다 TestClass의 인스턴스를 초기화해야 하므로 시간이 더 많이 소요됩니다. 반면에 ClassInOneStruct는 클래스가 구조체를 포함하고 있으므로 구조체가 클래스를 초기화할 때와 같이 간단한 초기화 과정을 거칩니다.

구체적으로 말하면, StructInOneClass의 경우 클래스를 초기화할 때 추가적인 메모리 할당 및 해제 작업이 수행되어야 합니다. 이것은 클래스의 인스턴스 생성 및 해제에 관련된 오버헤드 때문에 더 많은 시간이 소요됩니다. 반면에 ClassInOneStruct는 클래스의 인스턴스를 초기화하는 것이기 때문에 이러한 추가 오버헤드가 없습니다.

G선생님이 매우 정확하진 않기에 매우 신뢰할 수 있는 답변은 아니지만... 다른 실마리를 찾게 된다면 다시 한번 정리해 보겠습니다.

  • 오버헤드: 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 및 메모리

[iOS] Struct와 Class의 한판승부 - 2

profile
🍎Apple Developer Academy @ POSTECH 2nd, 🌱SeSAC iOS 4th

0개의 댓글