Bounds checks optimizations
- Swift엔
precondition
이라는 것이 있다. 다만 이건 몇가지 단점이 있음
- 속도를 느리게 함
- 다른 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)