Understading Swift Performance.key.zip

Untitled

Swift에서 추상화 매커니즘을 선택 할 때, Allocation, Reference Counting, Method Dispatch 이 세개를 중점으로 생각해야 한다.

  1. 내 인스턴스가 Stack or Heap 둘 중 어디에 할당되는가?
  2. 내가 인스턴스를 전달할 때, 얼마나 많은 Reference Counting Overhead가 일어나는가?
  3. 내가 내 인스턴스 메서드를 호출할 때, 그 메서드는 Static dispatch를 통해 일어나는 것인가? 아니면 Dynamic Dispatch를 통해 일어나는 것인가?

오른쪽으로 갈수록 성능은 저하되고, 왼쪽으로 갈수록 성능은 좋아진다.

Allocation

Stack

Swift는 자동으로 메모리를 할당, 해제한다. 메모리 중 일부는 Stack에 할당된다.

Stack은 LIFO구조이다. Stack의 마지막, 즉 Top으로만 Push가 가능하며 Top에서만 Pop이 가능하다. 그러니 Stack 끝에 포인터만 유지하면 Push, Pop을 구현할 수 있다. 이 포인터를 Stack Pointer라고 부른다.

함수를 호출할 때, 우리는 메모리에 먼저 할당을 해야한다.

그 메모리를 단순히 Stack 포인터가 가리키고 있는 곳을 단순히 줄임(decrementing)으로써 필요한 메모리를 할당할 수 있다. 그리고 함수가 끝나면, Stack 포인터를 줄이기 전에 있던 곳으로 증가(incrementing)시킴으로써 그 메모리 할당을 해제할 수 있다.

Untitled