Swift optimization

Young Bin Lee·2022년 9월 18일
0

Bounds checks optimizations

  • Swift엔 precondition이라는 것이 있다. 다만 이건 몇가지 단점이 있음
  1. 속도를 느리게 함
  2. 다른 optimization을 막는다. 이를테면 vectorize를 하지 못하게 함.

해결책

  • 이렇게 하면 된다고 한다. 밖으로 빼면 1번만 들리면 된다는 건데 아마 n을 미리 지정하는 작업이 필요할 듯.

Vectorize

Vectorization" (simplified) is the process of rewriting a loop so that instead of processing a single element of an array N times, it processes (say) 4 elements of the array simultaneously N/4 times.

벡터라이즈는 루프에서 어레이 연산을 벡터화시켜 n번에 걸쳐 할 일을 한 번에 하게 만들어 준다.

// Scalar approach:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

// Vectorized approach:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}
  • 이 경우 CPU instruction이 달라 더빠른 연산을 지원할 수 있게 해준다고 한다.
  • 컴파일러가 컴파일 시 최적화해야 한다.

Swift 써야하는 이유

  • 개빠름

Xcode의 기존 컴파일 방식

  • 문제는 옵티마이저가 하나의 파일에만 초점을 맞추고 있다는 것

Whole module optimazations

  • 컴파일이 한 파일에만 국한되지 않음
  • 모듈 전체를 분석해 나은 최적화를 제공
  • 옵션으로 고를 수 잇어용. 컴파일이 좀 오래걸리긴 함.

성능 최적화하기

Reference counting

struct vs. ref counting

Class array loop

  • 클래스 어레이의 루프에서 새로운 변수를 만들 때는 클래스를 참조하는 새로운 메모리 주소가 할당된다.
  • 그러므로 시작할 때 RC를 올리고 나올 때 RC를 내리는 작업이 필요하다.

struct array loop

  • struct는 애초에 RC가 필요 없고 바로 쓸 수 있다.
  • 더 빠르다

struct having RC

해결하기 - Wrapper class

Generic

  • 사실 generic을 사용하면 컴파일러는 가려진 노란 코드를 대신 써준다

해결


  • 타입이 선명시 될 경우 컴파일러가 최적화를 해준다.
  • 이렇게 하면 런타임에서 쓸 데 없는 코드 실행을 줄이고 필요없는 RC(Protocol witness table, function table에 대한)를 없애는 효과가 있다.

WMO의 효능 예시

  • 파일을 같이 보니까 definition을 확인 가능함
  • 이제 최적화가 되는 것임. min(:T) -> min(:Int)

profile
I can make your dream come true

0개의 댓글