Understanding Swift performance - Method Dispatch

고라니·2024년 2월 15일
0

TIL

목록 보기
61/67

Understanding Swift performance

이전처럼 이번에도 'Understanding Swift performance'를 보고 헷갈렸던 부분이나 궁굼증을 중심으로 정리해보겠다.

Method Dispatch

이 영상에서 Swift의 성능을 고려할 때 3가지 주요 고려 사항을 소개했다. 그 중 3번째는 "내 인스턴스의 메소드를 호출 할 때 static dispatch인가 dynamic dispatch인가"에 대한 내용이다.

Swift의 성능 향상을 위해 Method Dispatch를 잘 이해하고 있어야 한다.

Dispatch?

프로그래밍에서 "Dispatch"는 작업의 분배, 스케중링, 처리 등을 의미한다.
그럼으로 Method Dispatch란 메서드의 호출 방법에 대한 개념이다.

정적 디스패치(Static Dispatch)와 동적 디스패치(Dynamic Dispatch)

정적 디스패치와 동적 디스패치는 메서드 호출을 처리하는 두 가지 다른 방식이다. 이에 대한 비교를 살펴보자.

정적 디스패치

  • 컴파일 타임에 메서드 호출 결정된다.
  • 컴파일 타임에 메서드 호출이 결정되므로 호출시 오버헤드가 적다. 호출 부분이 메서드의 실제 주소로 대체되며, 그렇기 호출과정이 빠르다.
  • 하위 클래스에서의 오버라이딩에 대한 영향이 없다.
  • 호출 부분이 변경되면 해당 부분을 다시 컴파일 해야 한다.

동적 디스패치

  • 런타임에 메서드 호출 결정된다.
  • 가상 메서드 테이블(VMT)를 통해 실행 시에 실제 호출할 메서드의 주소를 찾는다.
  • 실행 시에 메서드 호출이 결정되기 때문에 가상 메서드 테이블을 통해 메서드를 찾아야 하는 오버헤드가 있다.
  • 호출 부분이 변경되어도 실행 시에 동적으로 메서드가 결정되기 때문에 다시 컴파일 할 필요가 없다.

가상 메서드 테이블(Virtual Method Table)

가상 메서드 테이블(Virtual Method Table) 즉 VMT는 객체 지향 프로그래밍에서 다향성을 지원하는 메커니즘 중 하나이다. VMT는 객체의 가상 메서드들에 대한 주소를 담은 테이블이다.

  • 각 클래스는 하나의 VMT를 가진다.
  • VMT는 메서드 주소를 담은 포인터 배열이며, 클래스의 가상 메서드들에 대한 주소를 순서대로 저장한다.
  • 인스턴스는 해당 클래스의 테이블에 대한 포인터를 가지며, 런타임에 올바른 메서드를 찾아 호출할 수 있다.

Dynamic Dispatch를 Static Dispatch로

클래스는 상속이 가능하기 때문에 해당 메서드가 오버라이드 되었는지 부모의 메서드인지 등을 확인하기 위해 VMT를 참조하고 조회하여 실제 호출되어야 하는 메서드를 찾아낸다.
설명을 잘 이해했다면 Dynamic Dispatch보다 Static Dispatch의 성능이 더 좋다는것을 알 수 있다.

더이상 상속이 없는 클래스의 경우 final 키워드를 통해 정의해주면 더이상 상속이 없을것임을 프로그램에 알리고 컴파일 시점에 최적화하여 Static Dispatch가 가능하다.

Dynamic Dispatch는 왜 사용할까?

위의 가상 메서드 테이블(VMT)의 설명처럼 다형성을 지원하기 때문이다.
다형성을 적용하면 유연성과 확장성 ⬆️, 코드의 재사용성 ⬆️, 유지보수 용이성 ⬆️, 코드의 가독성 ⬆️, 타입의 객체 통합 등 많은 이점을 얻을 수 있다.


마치면서

Swift에서 성능 고려와 함께 코드의 유연성을 유지하기 위해 이러한 디스패치 방식을 효과적으로 사용하는 것이 중요하다. 나머지 성능 향상을 위한 내용에 대해서도 다음글에 이어서 알아보자

profile
🍎 무럭무럭

0개의 댓글