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, +))
Class 안에 여러 Class의 인스턴스를 넣은 것과, Struct 안에 여러 Class의 인스턴스를 넣었다. 어떤 것이 생성되는 속도가 더 빠를까?
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가 조금 더 느린 모습을 보여주었는데, 왜지..?
G선생님의 답변으로는..
이 코드에서 StructInOneClass는 구조체가 클래스를 포함하고 있습니다. 이는 각 인스턴스가 생성될 때마다 TestClass의 인스턴스를 초기화해야 하므로 시간이 더 많이 소요됩니다. 반면에 ClassInOneStruct는 클래스가 구조체를 포함하고 있으므로 구조체가 클래스를 초기화할 때와 같이 간단한 초기화 과정을 거칩니다.
구체적으로 말하면, StructInOneClass의 경우 클래스를 초기화할 때 추가적인 메모리 할당 및 해제 작업이 수행되어야 합니다. 이것은 클래스의 인스턴스 생성 및 해제에 관련된 오버헤드 때문에 더 많은 시간이 소요됩니다. 반면에 ClassInOneStruct는 클래스의 인스턴스를 초기화하는 것이기 때문에 이러한 추가 오버헤드가 없습니다.
G선생님이 매우 정확하진 않기에 매우 신뢰할 수 있는 답변은 아니지만... 다른 실마리를 찾게 된다면 다시 한번 정리해 보겠습니다.