2016-12-22 12 views

답변

2

내가 알기로, 신속한 값 유형은 힙과 반대로 스택에 저장되기 때문에 더 효과적 일 수 있습니다.

간혹 있습니다. 자주하지 않습니다. 예를 들어 String에는 힙 할당 스토리지가 포함됩니다. 많은 값 유형에는 힙 할당 스토리지가 숨겨져 있습니다 (실제로는 , 실제로는). 따라서 많은 유형에서 기대할 수있는 성능 향상을 얻지 못할 수도 있지만 많은 경우 클로저를 통해 성능을 잃지는 않을 것입니다.

값 유형은 성능이 아니라 행동에 관한 것입니다 (물론 value types and value semantics을 구별해야하며 성능에 영향을 미칠 수 있음). 값 유형과 DispatchQueue에 대한 좋은 점은 실수로 여러 대기열의 값을 수정하지 않는다는 것입니다. 왜냐하면 자신 만의 독립적 인 사본이 있다는 것을 알고 있기 때문입니다. 큐에 디스 패칭하는 오버 헤드를 지불 할 때 (최적화되었지만 여전히 저렴하지는 않음), 값 유형을 복사하는 데 드는 추가 비용은 중요한 문제가 아닐 수 있습니다.

필자의 경험에 비추어 볼 때, 특히 Copy-On-Write 최적화로 인해 Swift 성능에 대해 판단하는 것은 매우 어렵습니다. 그러나 명백한 "값 유형"이 숨겨진 내부 참조 유형을 가질 수도 있다는 사실은 성능 분석을 매우 까다로워하게 만듭니다. 종종 변경 될 수있는 내부 세부 정보를 알고 의존해야합니다. 신속한 수행을 위해 머리를 쓰려면 심지어 Understand Swift Performance (아마도 두어 번)을보아야합니다. C++의 성능 직감을 가져 오려면 Swift에 대해 거의 모든 것을 포기해야합니다. 다르게 많은 일을합니다.

1

성능 메트릭 및 최적화보기가 스위프트 모델과 완전히 일치하지 않는다고 생각됩니다.

먼저, 그 점을 정확하게 알고있는 것처럼 보이지만, 일반적으로 "스택 할당"및 "힙 할당"이라는 용어는 오해의 소지가 있습니다. 값 유형은 참조 유형의 일부일 수 있으며 힙에 살 수 있습니다. 마찬가지로 힙으로 이동하는 것은 실제로 힙으로 이동하지 않아도됩니다. 참조 카운팅을 필요로하지 않는 참조 카운트 된 객체는 알지 못하는 스택에 할당 될 수 있습니다. C++과 같은 다른 언어에서 preferred terminology은 "자동 저장"("스택") 및 "동적 저장"("힙")입니다. 물론 Swift에는 이러한 개념 (값 유형 및 참조 유형 만 포함)이 없지만 성능 특성을 설명하는 데 유용합니다.

도주 클로저는 수명이 스택 프레임에 연결될 수 없기 때문에 동적 저장소가 필요합니다. 그러나 클로저가 항상 할당되고 클로저가 임의의 수의 값에 대해 스토리지를 가질 수 있기 때문에 탈출 클로저를 사용하는 함수를 호출하기 위해 지불하는 성능 가격은 캡처해야하는 변수의 수와 상관없이 일정합니다.

즉, 캡처 된 값 유형 개체는 모두 단일 동적 할당으로 그룹화되며 메모리 할당의 성능 비용은 요청하는 양에 따라 확장되지 않습니다. 따라서 클로저 자체를 벗어나는 것과 관련된 (작은) 속도 비용이 있음을 고려해야하지만 클로저가 포착하는 값의 수와 함께 비용은 확장되지 않습니다. 부득이한 선행 비용을 제외하고는 값 유형에 대한 성능 저하가 없어야합니다.

또한 롭이 말했듯이 모든 중요한 변수 유형 (문자열, 배열, 사전, 집합 등)은 실제로 참조 유형에 대한 래퍼이므로 이러한 객체의 경우 값 유형은 성능 이점.